前提・実現したいこと
例えば
int a=3;
double b=3.0;
と
int型変数aとdouble型変数bを宣言して
a==b
と等価演算子で結び、この式を評価すると、
まず「暗黙の型変換」によりint型変数aはdouble型変数aに型変換されますよね?
そして、この式の評価値は1、つまり等しいということなのですが、これは内部ビットが等しいという意味でしょうか(またそれだけでしょうか)。
このような質問をした背景には以下のソースコードが関係しております。
float値0にfor文でfloat値0.01足し続けた float値0.999999と普通に宣言したfloat値0.999999は、画面の表示上はともに「0.999999」なのですが、比較をすると異なるという、個人的に面白い(?)結果になりました。
このことから、「変数が等しいこと」と「内部ビットが等しいこと」は同値であると考えましたが、これは正しいでしょうか?
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
C言語
1#include <stdio.h> 2#include <string.h> 3 4void hudoufloat(float); 5// floatを与えると浮動小数点数表示の内部ビットをプリントする関数 6 7int main(void) 8{ 9 float x; 10 for ( x = 0; x <=(float)0.99; x+=(float)0.01) 11 { 12 printf("%f\n",x); 13 hudoufloat(x); 14 } 15 printf("ここから下がお聞きしたいところです\n"); 16 printf("%f ver a\n",x); 17 // 0.999999 ver a 18 // これはfloat 0にfloat 0.01を足し続けた0.999999 19 hudoufloat(x); 20 // 00111111 01111111 11111111 11110101 21 22 printf("%f ver b\n",(float)0.999999); 23 // 0.999999 ver b 24 // これは普通の0.999999 25 hudoufloat((float)0.999999); 26 // 00111111 01111111 11111111 11101111 27 28 if (x!=(float)0.999999) 29 { 30 printf("%fと%fは等しくない\n内部ビットが異なるから、画面の表示上おなじ「float型0.999999」なのに等しくないという理解でただしいでしょうか\n",x,(float)0.999999); 31 // 内部ビットが異なるから、画面の表示上おなじ「float型0.999999」なのに等しくないという理解でただしいでしょうか 32 } 33 34 35 return 0; 36} 37 38void hudoufloat(float f){ 39 40 int i,j,k; 41 char c[sizeof(f)]; 42 memcpy(c, &f, sizeof(f)); /* fの内容を配列cにコピー */ 43 printf("sEEEEEEE EEEEdddd dddddddd... \n"); 44 45 for( i = sizeof(f) - 1 ; i >= 0; i--) 46 { 47 for ( j = sizeof(c[i]) * 8 - 1 ; j >= 0 ; j-- ) 48 { 49 k = c[i] & (1 << j); /* jを1つずつずらして論理積をとる */ 50 printf("%d", k ? 1 : 0 ); /* k=0でなければ1, k=0ならば0を表示 */ 51 } 52 printf(" "); 53 } 54 printf("\n"); 55 56 return; 57} 58 59
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
cygwinでgccコンパイラを使用しています
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/27 14:32
2021/07/27 15:03 編集
2021/07/27 15:40
2021/07/28 03:40 編集