場合によって値が変わってしまいます。
これはいったいどういうことでしょうか??
開発環境はWindows2000 VC++6.0
実行環境はWindows98です。
Windows2000で実行した場合は値は一緒なのですが
Windows98の場合は値が変わってしまいます。
Windows98で下のプログラムを実行すると
int test1;
double test2;
・
・
・
test1 = (int)test2
char mes[1024];
printf(mes, "%lf, %d", test2, test1);
test2は100.000000
そしてtest1が100となります。
しかし、プログラム実行中にプログラムメニューの[印刷]等、Windowsのメニューを使うと
test2は100.000000なのですが
test1が99になってしまいます。
これはいったいどういうことなのでしょうか。
値が減ることなんてありえるのでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
こういう場合真っ先に疑うのは「桁落ち」です。
test2 は見かけ上は 100.000000 でも、実際には、
99.99999999999999
ということもありえます。
そうするとこのintを取ると、test1 = (int) test2 とすると test1 = 99 になります。
つまり切り捨てになっているわけです。
たとえば、
test1 = (int) ( test2 + 0.5 )
とすると、test2を小数点以下四捨五入したことになります。
確かめるのは、たとえば test1 = (int) (test2 + 0.0000001) と小さい数字を加算してどうなるかを確かめて見ましょう。
Win2000とWin98で動作が異なるのはおそらく、test2に対する計算のどこかでわずかに計算結果の異なるライブラリなどが使われているためではないでしょうか。
No.3
- 回答日時:
int型は,16ビットマシン(Windows98)では,16ビット(2バイト)になります.
32ビットマシン(Windows2000)では,32ビット(4バイト)になります.
従って,int型は使わず,short型:16ビット(2バイト)かlong型:32ビット(4バイト)の指定をお勧めします.
No.2
- 回答日時:
プログラムすべてを書かれていないのではっきりしたことはいえませんが、どこかで、test1にごみが入っているのではないですか。
キャストをすると精度が変わりますので、値が変わる場合がありますが、それは、doubleの変数に-32768以下か32767以上の数値を入れて、キャストしたような場合です。この場合数値が100ですので、数値がおかしいのは、他の部分に原因があると思います。
ちなみにprintf関数の使い方も間違っています。
printf(制御文字列,変数1,変数2,....);
このプログラムの場合、制御文字列にあたる部分が、mesと"%lf,%d"と二つあります。BASICとは違って、こういったミスに対して、シンタックスエラーの表示はされませんので、気をつけてください。
printf("%s %lf,%d",mes,test2,test1);
あるいは、
strcpy(mes,"何らかのメッセージ %lf,%d");
printf(mes,test2,test1);
が正しい書き方です。
c言語は文法的なエラーがあっても一応動きますので、バグに気づきにくいのです。ただその出力結果は不安定になります。
この回答への補足
すいません、
printf("%s %lf,%d",mes,test2,test1);
は
sprintf("%s %lf,%d",mes,test2,test1);
の間違えでした。
補足書き間違えました。
printf(mes, "%lf, %d", test2, test1);
は
sprintf(mes, "%lf, %d", test2, test1);
の間違えでした。すいません。以後気をつけます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
だれがとけるの?
-
バッチファイルで以下のような...
-
C#,vb.netで業務用アプリ開発と...
-
ArduinoのジャイロモジュールMP...
-
gccを行ってもexeファイルが生...
-
これなにがちがうんですか??
-
応用情報技術者試験の令和元年...
-
C言語 配列と関数の練習問題
-
質問失礼します。 プログラム言...
-
へんな現象
-
右ビットシフト
-
Linux Cプログラミングを学ぶた...
-
Notepad++の関数リスト表示の変...
-
Bitcoin、BTCはブロックチェー...
-
どなたかこのプログラミングを...
-
Windows formアプリで データグ...
-
インクリメント演算子のみを用...
-
プログラミングについて。 1つ...
-
mallocについて
-
[C言語]fputsとfprintfの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
Expression: nptr != NULL
-
C言語のエラーについて
-
C言語 コンパイルエラー(文字...
-
プログラミングが分かりません。
-
C言語初心者です。計算がうまく...
-
C言語で自作ヘッダーを作ったの...
-
C言語のソースコードについて教...
-
加減剰余のオーバーフローについて
-
'printf':識別子が見つかりませ...
-
分割コンパイルの手順と方法に...
-
プログラムがエラーが出る原因
-
C言語:2つの複素数(分数)の四...
-
TCP/IP: 非ソケットに対するソ...
-
getch / putch用のヘッダ
-
doubleからintへのキャスト
-
コンソールAPIのSetConsoleScre...
-
3×3のラテン方陣をつくるプログ...
-
リターンキー又は、スペースキ...
-
コンパイルエラー (超初心者...
おすすめ情報