0

入力を double で取得してから、小数部分を取り出すために型キャストしています。ただし、入力が小さい数値の場合4294967295.2は小数部分が取得されますが、これよりも大きな数値を入力すると、小数部分がゼロになります。私はそれがいくつかのことであることを知っていますが、私はこのことに少し慣れていません。入力数値が . のような場合に小数部がゼロになる理由は何9007199254740991.2ですか コードは次のとおりです。

unsigned long long first,second;
double a,b,remainderA,remainderB;
cout << "Enter first number:\n"<< endl;
cin>> a;
cout << "\nEnter second number:\n"<< endl;
cin >> b;

first=(unsigned long long) a;
second=(unsigned long long) b;

remainderA=a-first;
remainderB=b-second;


cout<<remainderA<<endl;

よろしく

4

4 に答える 4

2

それは単に精度の問題です。ダブルには52ビットの仮数があり、10進数で約15〜17ビットになります。2番目の例はこの制限に達し、分数(0.2)はdouble内に格納されない可能性があります。

于 2012-12-30T06:32:29.230 に答える
0

入力番号がターゲットタイプに存在するのに十分な大きさである場合、0にキャストされます。より広い範囲を持つdoubleで入力を取得しています。範囲が狭いunsignedlonglongにキャストします。それが問題が起こっている理由です。

あなたは以下を見るかもしれません

http://www.tutorialspoint.com/cprogramming/c_type_casting.htm

于 2012-12-30T06:29:04.280 に答える
0

doubleの範囲は:1.7E +/- 308(15桁)
で、unsigned long longの範囲は0〜18,446,744,073,709,551,615(20桁)

で、最初にキャストしています=(unsigned long long)a;
例えば。「a」に9007199254740991.2を挿入する場合、
挿入される値は次のようになります。

    a = 9,0072e+015 
    first :90071992547409910

したがって、それは精度の問題です。それがあなたが問題を抱えている理由です。

于 2012-12-30T06:36:29.690 に答える
0

浮動小数点数は、特定の桁数を格納します。数値が長すぎる場合、小数部分はすでにデータ型の制限精度を超えています。

より有効数字を取得するにはdouble、 を試してくださいlong double。たとえば、次のように出力 されます0.2(精度が限られているため、おおよその結果です): https://ideone.com/i8Yyt0

std::floor大きな数値を整数型にキャストすると、整数型の範囲外で未定義の動作が発生するため、丸めを実行するために使用することができます。(整数をゼロで割るように、クラッシュする可能性があります。)

于 2012-12-30T07:09:29.807 に答える