-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)に丸められるのですか?
*正確に浮動小数点数*を表すことができますアーキテクチャがあります - 表す 'PI'は正確には、... –
があり、無限の実数が、有限の浮動小数点表現があるので、無ください。 – stark
10進数の後ろに4桁の数字が正確に表示されるようにするには、数字を10000倍にして整数演算を使用できます。 – stark