アカウント名:
パスワード:
十数年仕事で(アマ時代を入れると20年以上)使っていたのに知らなかったので数日はまった。
バグったコードからエラー原因を簡素化したテストコードは以下。float型(i)とint型(k)で1ずつ加算していって異なったら標準エラーに出力。
#include <stdio.h>int main(){ float i; int k; i=0; for(k=0;k<=16777217;k++){ if(k != (int)i) fprintf(stderr,"%i %i\n",k,(int)i); i += 1; } return 0;}
もろもろ込み込み、私の記憶もアレですが、
>float型(i)とint型(k)で1ずつ加算して
float の i に int の 1 を加算するのがアレなんじゃなかったっけ?float の i には float の 1.0 を加算する必要があったような。
# awk と間違えているような気もする・・・
式の中に浮動小数点があったら全部doubleに変換してから計算するのCの仕様だったはず。だからintを加算しているのは問題ないと思う。
それより問題は、ループの最後の方でfloatのiが16777217に近くなったとき、精度が足りなくて1の桁まで表せず、1を加えてもiの値が変化しなくなること。計算はdoubleでやるけど、変数iへ書き戻すときにfloatに変換して下位の桁が切り捨てられる。
で、こういう話 [srad.jp]が出てくる。
式の中に浮動小数点があったら全部doubleに変換してから計算するのCの仕様だったはず。
おじいちゃん、朝ごはんならさっき食べたでしょ。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell
floatで整数を数えあげちゃいけない@C言語 (スコア:1)
十数年仕事で(アマ時代を入れると20年以上)使っていたのに知らなかったので数日はまった。
バグったコードからエラー原因を簡素化したテストコードは以下。
float型(i)とint型(k)で1ずつ加算していって異なったら
標準エラーに出力。
Re:floatで整数を数えあげちゃいけない@C言語 (スコア:0)
もろもろ込み込み、私の記憶もアレですが、
>float型(i)とint型(k)で1ずつ加算して
float の i に int の 1 を加算するのがアレなんじゃなかったっけ?
float の i には float の 1.0 を加算する必要があったような。
# awk と間違えているような気もする・・・
Re: (スコア:0)
式の中に浮動小数点があったら全部doubleに変換してから計算するのCの仕様だったはず。
だからintを加算しているのは問題ないと思う。
それより問題は、ループの最後の方でfloatのiが16777217に近くなったとき、
精度が足りなくて1の桁まで表せず、1を加えてもiの値が変化しなくなること。
計算はdoubleでやるけど、変数iへ書き戻すときにfloatに変換して下位の桁が切り捨てられる。
で、こういう話 [srad.jp]が出てくる。
Re: (スコア:0)
式の中に浮動小数点があったら全部doubleに変換してから計算するのCの仕様だったはず。
おじいちゃん、朝ごはんならさっき食べたでしょ。