5

重複の可能性:
IEEE 754浮動小数点数が正確に表現できない最初の整数はどれですか?

まず、これは宿題の質問です。これをすぐに解決するためです。もちろん、私はスプーンで供給される解決策を探していません。正しい方向へのちょっとした指針かもしれません。

したがって、私のタスクは、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」の何かを達成することを期待して、失敗しました。

誰かが私に希望のブレーク条件を得るために信頼できるフローティングポイントのプロパティを指摘できますか?

--------------------以下の更新---------------

これについて助けてくれてありがとう!私はここで複数のことを学びました:

  1. 私の当初の考えは確かに正しく、実行する予定のマシン(Solaris 10、32ビット)で結果を決定しましたが、Linuxシステム(64ビットおよび32ビット)では機能しませんでした。

  2. Hans Passantが追加した変更により、プログラムは私のシステムでも機能するようになりました。ここでは、予期していなかったプラットフォームの違いがいくつか発生しているようです。

みんなありがとう!

4

3 に答える 3

5

問題は、等式テストが浮動小数点テストであるということです。i変数は最初にfloatに変換され、もちろん同じfloatを生成します。floatをintに変換して戻し、整数の等式テストを取得します。

float result = (float)i;
int truncated = (int)result;
if (truncated != i) break;

16の数字で始まる場合は、正しい数字が見つかります。それを16進数に変換し、それがグレードボーナスに失敗した理由を説明します。

于 2010-10-08T12:00:24.087 に答える
1

浮動小数点の表現を(基数、符号、仮数、指数)として推論する必要があると思います

ここにあなたに手がかりを与えることができるウィキペディアからの抜粋があります:

特定の形式は次のもので構成されます。

* Finite numbers, which may be either base 2 (binary) or base 10

(10進数)。各有限数は、3つの整数で最も簡単に記述されます。s=符号(0または1)、c =仮数(または「係数」)、q=指数。有限数の数値は(-1)s×c×bqです。ここで、bは底(2または10)です。たとえば、符号が1(負を示す)、仮数が12345、指数が-3、底が10の場合、数値の値は-12.345になります。

于 2010-10-08T11:49:19.047 に答える
-1

それはですFLT_MAX+1。を参照してくださいfloat.h

編集:または実際にはそうではありません。modf()で機能を確認してくださいmath.h

于 2010-10-08T12:00:27.080 に答える