2017-03-29 12 views
-2

'cout'で値を印刷する際に問題があります。私はコンソールで値 "9223372036854775807"を見たいと思っていますが、私はただ "9223372036854775800"を取得し続け、負の値でも同じことが起こります。私はまた、最大値としてこれを入力し、小数点以下の桁数を保持したいと思っています。C++ long doubleに変更することなく、最大倍精度(8バイト)の値を完全精度で出力する方法はありますか?

---------------これらは、最小値と最大値

double al = scnd_num_min(num1, Oprt); 
al = al * (-1); 
double ah = scnd_num_max(num1, Oprt); 

--------------これになります

double scnd_num_max(double num1, char Oprt) 
    { 
    double max1 = 9223372036854775807; 
    double max2 = 9223372036854775806; 
    double min1 = -9223372036854775806; 
    switch(Oprt) 
    { 
    case '+': 
     if (num1 <= 0) 
      return max1; 
     else 
      return (max1 - num1); 
    case '-': 
     if (num1 >= -1) 
      return max1; 
     else 
      return ((max1 - (num1 * (-1)))+1); 
    case '*': 
     if ((num1 < min1) || (num1 > max2)) 
      return 1; 
     else if (num1 == 0) 
      return max2; 
     else if (num1 > 0) 
      return (max2/num1); 
     else 
      return (max2/(num1 * (-1))); 
    case '/': 
     return max2; 
    } 
} 

プリティ同じ負の値のためである:私は、これらの値

cout << "Please enter a value within a range of: " << "\n" << fixed << al; 
cout << " and " << ah << " : "; 

を印刷し、それが値を取得するための一つの機能がどこにあるかです。

+2

参考読書を参照してください:[すべてのコンピュータ科学者は、浮動小数点演算について知っておくべきこと](https://docs.oracle.com/ cd/E19957-01/806-3568/ncg_goldberg.html)TL; DRバージョン:精度を失う前に、浮動小数点変数にあまりにもフィットすることができます。「double」の場合、これは約15桁です。 9,223,372,036,854,775,807は19桁です。 – user4581301

答えて

0

倍精度は64ビットですが、浮動小数点数は符号ビット、指数、仮数で構成されているため、long long(64ビットも可)が保持できるすべての値を保持することはできません。ダブルの仮数は52ビット幅であるため、52ビット(実際には符号ビットのため53ビット)のワイド整数は倍精度での精度を損なうことなく格納でき、残りの部分は正確さが失われる可能性があります。

編集:ところで、二重の最大は1.79769e + 308で、this link

+0

さて、私は1.79769e + 308を最大値にしますが、C++でそのビットサイズを増やす方法はあるのでしょうか? –

+0

@TourerPovilasいいえ、ダブルのビット数を増やすことはできませんし、サブディビジョンを仮数と指数に変更することはできません。あなたは[this](https://gmplib.org/)のようなライブラリを使うことができます。 – yar

関連する問題