2017-02-03 4 views
3

浮動小数点数にはかなりの桁数と基数の指数(通常は10)が含まれていることを理解しています。仮数部を過ぎたものは何も正確なものではないでしょう。何もないので、浮動小数点をint(またはlong)に変換すると、偽の数字が現れます。ここで浮動小数点をintに変換するとき、末尾の数字はどこから来ますか?

はPythonの例です:

>>> int(1e308) 
100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336L 

彼らは何度も同じ値が与えられたときに変更していないようですので、それはおそらく完全にランダムまたはメモリ内の神秘的なスポットから引かれません。これらの乱数はどこから来ますか?これらの末尾の数字を正確に生成するのはどういうことでしょうか?なぜ変換は単純に乱数をゼロとして設定しないのですか?

答えて

6

ランダムではありません! の変換では、はすべての「ランダムな」数字を0に設定します。ちょうどベース10ではない!

Python(2.6以上)では、どのように浮動小数点値が格納されているかを簡単に確認できるように、.hex()を任意の浮動小数点数で呼び出すことができます。 1e308を入力すると、'0x1.1ccf385ebc8a0p+1023'になります。右側には、入力された値になるように左の16進値を上げるために必要な2の累乗が表示されます。バイナリでは、16進値は1.00011100110011110011100001011110101111001000101です。^1023年2を乗じ

だけ正確にint(1e308)ある

1000111001100111100111000010111101011110010001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

を残して1023ヶ所で小数点を超えるシフトします。浮動小数点から整数への変換は、基数2の基数を単純にシフトし、残りを落とします。

関連する問題