CPU は double を 8 バイトで表します。これは、1 符号ビット、指数 (「範囲」) 用の 11 ビット、および仮数 (「精度」) 用の 52 ビットに分割されます。範囲と精度が限られています。
の C 定数DBL_DIGは、そのような double が正確に15 桁<float.h>
しか表現できないことを示しています。ただし、この数は、c ライブラリと CPU に完全に依存します。
330.1500249000119 は 18 桁なので、330.150024900012 に丸められます。330.15002490001189 は 1 回限りで、これで問題ありません。通常、1.189 対 1.2 を期待する必要があります。
背後にある正確な数学については、David Goldberg の「What Every Computer Scientist Should Know About Floating-point Arithmetic」、ACM Computing Surveys 23、1 (1991-03)、5-48 を読んでみてください。詳細に興味がある場合は読む価値がありますが、コンピューター サイエンスのバックグラウンドが必要です。
http://www.validlab.com/goldberg/paper.pdf
long double や __float128 などのより優れた浮動小数点型を使用するか、HW でネイティブに long double として 41 桁 (__float128) を使用する Sparc64 や s390 などのより優れた CPU を使用することで、これを防ぐことができます。
はい、UltraSparc/Niagara または IBM S390 を使用することは文化です。
通常の答えは次のとおりです: long doubleを使用してください。これにより、Intel ではさらに 2 バイト (18 桁)、powerpc ではさらに数バイト (31 桁)、sparc64/s390 では 41 バイトが得られます。