numpy float32截断小数

Aus*_*tin 0 python floating-point numpy

我正在开展一个学校项目,要求我对单精度浮点数做一些数学计算.我以为我会在numpy中使用float32格式,因为python实际上是我所知道的唯一通用语言.IMO这个数字格式应该能够处理数字1.0000001,但它一直将我的答案截断为1.0.我能得到的最接近的是1.00001.任何人都可以对此有所了解吗?我是这个浮点格式和Python的新手.

import numpy as np

keyInput=np.float32(input("Enter a number and i'll float 32 it: "))
print(keyInput)
print(np.float32(keyInput))
print("This is of type: ",type(keyInput))

input('Press ENTER to exit')
Run Code Online (Sandbox Code Playgroud)

Con*_* Ma 5

首先,print没有明确的格式化或转换是不可靠的.你应该尝试类似的东西print "%.10f" % number而不是print number.

其次,正如评论家指出的那样,你不能指望所有十进制数都被精确地表示为浮点数.阅读Goldberg论文.这是必读的.

一个示例ipython会话(我使用Python 2.7,如果你使用Python 3,print是一个函数):

In [1]: import numpy

In [2]: print numpy.float32(1.0 + 1e-7)
1.0

In [3]: print "%.10f" % numpy.float32(1.0 + 1e-7)
1.0000001192

In [4]: print "%.10f" % numpy.float32(1.0 + 1e-8)
1.0000000000
Run Code Online (Sandbox Code Playgroud)

编辑:您可以numpy用来检查类型精度限制.请参阅numpy.MachAr更多的文档.

例:

In [1]: import numpy

In [2]: machar = numpy.MachAr(float_conv=numpy.float32)

In [3]: machar.eps
Out[3]: 1.1920928955078125e-07
Run Code Online (Sandbox Code Playgroud)