まず、これは宿題の質問です。これをすぐに解決するためです。もちろん、私はスプーンで供給される解決策を探していません。正しい方向へのちょっとした指針かもしれません。
したがって、私のタスクは、IEEE-754浮動小数点(32ビット)として表現できない最小の正の整数を見つけることです。「5==5.00000000001」のようなものでの同等性のテストは失敗することを知っているので、すべての数値をループして、次のようにテストすると思いました。
int main(int argc, char **argv)
{
unsigned int i; /* Loop counter. No need to inizialize here. */
/* Header output */
printf("IEEE floating point rounding failure detection\n\n");
/* Main program processing */
/* Loop over every integer number */
for (i = 0;; ++i)
{
float result = (float)i;
/* TODO: Break condition for integer wrapping */
/* Test integer representation against the IEEE-754 representation */
if (result != i)
break; /* Break the loop here */
}
/* Result output */
printf("The smallest integer that can not be precisely represented as IEEE-754"
" is:\n\t%d", i);
return 0;
}
これは失敗しました。次に、浮動小数点「結果」から整数「i」を減算しようとしました。これは、「0.000000002」の何かを達成することを期待して、失敗しました。
誰かが私に希望のブレーク条件を得るために信頼できるフローティングポイントのプロパティを指摘できますか?
--------------------以下の更新---------------
これについて助けてくれてありがとう!私はここで複数のことを学びました:
私の当初の考えは確かに正しく、実行する予定のマシン(Solaris 10、32ビット)で結果を決定しましたが、Linuxシステム(64ビットおよび32ビット)では機能しませんでした。
Hans Passantが追加した変更により、プログラムは私のシステムでも機能するようになりました。ここでは、予期していなかったプラットフォームの違いがいくつか発生しているようです。
みんなありがとう!