long double
I get18/19 = 0.947368421052631578...
を使用すると、循環947368421052631578
小数になります。double
I getを使用する0.947368421052631526...
ただし、前者は正しいです。なぜそのような間違った結果ですか?
手伝ってくれてありがとう。
Adouble
は通常、16(±1)の10進数を提供します。あなたの例はこれを示しています:
4 8 12 16
v v v v
0.947368421052631578 long double
0.947368421052631526 double
答えは16桁に同意します。これが期待されるべきことです。long double
また、C標準では、aが。よりも精度が高いという保証はありませんdouble
。
すべての10進数を有限量のビットで表現しようとしています。浮動小数点で正確に表現できないものもあります。フロートで正確な答えを期待することが最初の問題です。すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを見てください
これがいくつかの講義ノートからの要約です:
前述のように、実数を格納するためのビット数は有限であるため、コンピューターは実数を正確に表すことができません。したがって、1/3、2の平方根、PIなど、桁数が無限大の数値を完全に表すことはできません。また、実数の符号化の仕方から、有限の桁数でも正確に表現することはできません。
通常IEEE754double
で実装されるAは、 10進数の15〜17桁の精度になります。コンパイラに表示させることができたとしても、それを超えたものは信頼できません。