我正在使用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输出所示,还有多余的一位数字。
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.2250738585075072014e-308”。如果显示的位数少一些,如“ 2.225073858507201201e-308”,则它比2 − 1022更接近2 − 1022-2 − 1074,因此是错的。
但是,对于2 − 1022 + 2 − 1074,“ 2.225073858507202e-308”就足够了,因为与此最接近的可表示值为2 − 1022 + 2 − 1074] >。2 − 1022 + 2•2 − 1074更远。