2017-10-31 12 views
-2

に初期化:予想通りCで二重に丸めた値

#include <stdint.h> 
#include <stdio.h> 
#include <math.h> 
#include <string.h> 

int main(int argc, char* argv[]) { 
    double a = 10.333300; 
    double b = 10.333300000000000; 
    double c = nextafter(a,a+0.5); 
    double d = nextafter(b,a+0.5); 
    printf("[%012.12f]\n[%012.12f]\n[%012.12f]\n[%012.12f]\n", a, b, c, d); 
    return 0; 
} 

が印刷出力される。

$ ./nextafter 
[10.333300000000] 
[10.333300000000] 
[10.333300000000] 
[10.333300000000] 

しかし、真の値は、これらの正確されない:

(gdb) p a 
$1 = 10.333299999999999 
(gdb) p b 
$2 = 10.333299999999999 
(gdb) p c 
$3 = 10.333300000000001 
(gdb) p d 
$4 = 10.333300000000001 

これはthe way floats and doubles are representedによると思われます。古いRHEを搭載した64ビットx86 VMを使用していますL.

有効な2進数(この場合は0.333300000000001と思われる)が形成されるまで、0.3333を右にゼロで "パディング"することはできませんか?いいえ、問題が発生する可能性があります。私。デフォルトでnextafterを使用できますか?

倍精度デフォルトの精度(この場合は10または11)を設定する方法はありますか?

浮動小数点数を正確に表現できるアーキテクチャはありますか?

または、なぜ、10.3333がnextafterバージョンに丸められるのではなく、すぐに10.3332(9)に丸められるのですか?

+1

*正確に浮動小数点数*を表すことができますアーキテクチャがあります - 表す 'PI'は正確には、... –

+4

があり、無限の実数が、有限の浮動小数点表現があるので、無ください。 – stark

+2

10進数の後ろに4桁の数字が正確に表示されるようにするには、数字を10000倍にして整数演算を使用できます。 – stark

答えて

0

投稿フォーマット文字列を使用している:%012.12f

これはあまりにも多くの桁数の量を制限します。

%020.20fのようなフォーマット文字列を使用することをお勧めします。 I.

[10.33329999999999948557] 
[10.33329999999999948557] 
[10.33330000000000126192] 
[10.33330000000000126192]