我正在使用IEEE 754
定义的64位浮点运算。最小的次正规数是:
2^-1074 = 5e-324 = 5 * 10^-16 * 10^-308
将后者添加到realmin结果为:
2^-1022 + 2^-1074 = 2.2250738585072014 * 10^-308 + 5 * 10^-16 * 10^-308 = (2.2250738585072014 + 0.0000000000000005) * 10^-308 = 2.2250738585072019 * 10^-308
在Python中执行加法时,结果略有不同。这是简单的脚本:
import numpy as np
realmin = np.power(2.0, -1022)
print( "realmin\t\t" + str(realmin) )
smallestSub = np.power(2.0, -1074)
print( "smallest sub\t" + str(smallestSub) )
realminSucc = realmin + smallestSub
print( "sum\t\t" + str(realminSucc) )
输出为:
realmin 2.2250738585072014e-308
smallest sub 5e-324
sum 2.225073858507202e-308
为什么要四舍五入?如realmin输出所示,还有多余的一位数字。
答案 0 :(得分:0)
Python对浮点行为并不严格,因此以下某些内容是推测性的-它取决于实现。
Java和JavaScript要求将浮点值默认转换为字符串,以仅使用足够的十进制数字来唯一区分浮点值。例如,如果某些浮点格式的可表示值是3、3.0625、3.125、3.1875,依此类推,则将3.0625转换为字符串会产生“ 3.06”,因为这将其与3和3.125唯一地区分开来。之所以这么长,是因为较短的“ 3.1”无法将其与3.125区别开来。但是将3.125转换为字符串会产生“ 3.1”,因为这已经足够了;将3.1转换为最接近的可表示值将得出3.125。
由于Java和JavaScript要求这样做,所以进行这些转换的子例程变得很常见,并且Python实现很容易使用它们。此行为将解释您在Python实现中看到的结果。
尽管问题指出“ 2 ^ -1074 = 5e-24”,但事实并非如此。 2 -1074 正是4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625•10 -324 。浮点数的确切值在格式中很重要。在2 −1022 附近,可表示的值为:
现在我们可以看到为什么2 −1022 必须显示为“ 2.22507385850720142014-308”。如果显示的位数少一位,如“ 2.225073858507201201-308”,则它比2 −2更接近2 −1022 − 2 −1074 1022 ,所以这是错误的。
但是,对于2 −1022 + 2 −1074 ,“ 2.225073858507202e-308”就足够了,因为与此最接近的可表示值为2 −1022 < / sup> + 2 −1074 。 2 −1022 + 2•2 −1074 更远。