これをpythonシェルに入力しました:
>>> 0.1*0.1
0.010000000000000002
基数 10 の 0.1 は基数 2 では周期的であることがわかっているため、0.1*0.1 は 0.01 ではないと予想しました。
>>> len(str(0.1*0.1))
4
上記の20文字を見たので、20になると予想しました。なぜ 4 を取得するのですか?
>>> str(0.1*0.1)
'0.01'
わかりました、これはlen
私が 4 を与える理由を説明していますが、なぜ がstr
返されるの'0.01'
ですか?
>>> repr(0.1*0.1)
'0.010000000000000002'
str
丸くなるのに丸まらないのはなぜrepr
ですか?(私はこの回答を読みましたがstr
、フロートを丸めるときと丸めないときをどのように決定したか知りたいです)
>>> str(0.01) == str(0.0100000000001)
False
>>> str(0.01) == str(0.01000000000001)
True
そのため、フロートの精度に問題があるようです。Python は IEEE 754 単精度浮動小数点数を使用すると思いました。だから私はこのようにそれをチェックしました:
#include <stdint.h>
#include <stdio.h> // printf
union myUnion {
uint32_t i; // unsigned integer 32-bit type (on every machine)
float f; // a type you want to play with
};
int main() {
union myUnion testVar;
testVar.f = 0.01000000000001f;
printf("%f\n", testVar.f);
testVar.f = 0.01000000000000002f;
printf("%f\n", testVar.f);
testVar.f = 0.01f*0.01f;
printf("%f\n", testVar.f);
}
私が得た:
0.010000
0.010000
0.000100
Pythonは私に与えます:
>>> 0.01000000000001
0.010000000000009999
>>> 0.01000000000000002
0.010000000000000019
>>> 0.01*0.01
0.0001
Python でこれらの結果が得られるのはなぜですか?
(私は Python 2.6.5 を使用しています。Python のバージョンの違いを知っていれば、それらにも興味があります。)