间数花车说我有两个Python漂浮a
和b
,有一个简单的方法来找出表示的实数有多少是两个IEEE-754表示之间(或任何表示所使用的打印机是使用)?两个浮点数
两个浮点数
回答
我don'tknow你会使用什么本作 - 但是,如果同时有花车相同的指数,它应该是可能的。由于指数保持在高位,因此将浮点字节(在本例中为8个字节)作为整数加载并从另一个中减去一个,应该给出所需的数字。我使用结构模型来浮体装到一个二进制表示,然后解压缩的那些(C,8字节)长的整数:
>>> import struct
>>> a = struct.pack("dd", 1.000000,1.000001)
>>> b = struct.unpack("ll",a)
>>> b[1] - b[0]
4503599627
>>> a = struct.pack("dd", 1.000000000,1.000000001)
>>> b = struct.unpack("ll",a)
>>> b[1] - b[0]
4503600
>>>
结果指数并不重要,但标志确实如此。 – 2010-08-27 20:51:43
+1;很好的答案。不过,它不适用于长32位C的系统。为了安全起见,使用“
要完整,您可能还会提到此解决方案仅适用于IEEE 754格式。实际上,这并不是什么限制,但是 - 在使用非IEEE 754双打的平台上运行Python是非常困难的。 – 2010-08-28 16:49:12
对于正数B> A> 0,答案是大约:
(2**52) ** (log(b,2) - log(a,2))
有尾数的52位(过去的隐含1),再乘以2提升到的指数。
因此,有在范围内2 ** 52号[1:2)的范围是[1024:2048)
这个teory很不错 - 但是当浮点数太接近时它不适用于我。可能是由于日志计算引入了一些舍入本身。 – jsbueno 2010-08-27 21:07:42
AFAIK,IEEE754浮标有一个有趣的性质。如果你有浮点数f,那么
(*(int*)&f + 1)
在某些条件下,是下一个可表示的浮点数。所以对于浮点数a和b
*(int*)&a - *(int*)&b
会给你这些数字之间的浮点数的数量。
查看http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm了解更多信息。
唯一的要求是它们具有相同的符号,并且既不是南或inf。 – 2010-08-27 20:50:12
看起来它是*问题的答案,但是缺少一部分:如何在Python中做到这一点? – Bolo 2010-08-27 20:56:18
虽然这不能回答Python的问题,但这是一个非常好的答案。我的“计算方法”教科书也同意这一点。 任何人都知道一种方法将其转换为Python? – Dragontamer5788 2010-08-27 20:59:01
我会看看数学模块中的frexp函数。以下示例提取尾数并将其转换为整数。差异应该是这两个值之间的浮点数。
>>> math.frexp(1.1234567890)[0] * 2**53
5059599576307254.0
>>> math.frexp(1.12345678901)[0] * 2**53
5059599576352290.0
下面的代码应该这样做:
import math
import sys
def delta(x,y):
'''Return the number of floats between x and y.'''
x = float(x)
y = float(y)
if x == y:
return 0
elif x < y:
return -delta(y,x)
else:
x_mant, x_exp = math.frexp(x)
y_mant, y_exp = math.frexp(y)
x_int = int(x_mant * 2**(sys.float_info.mant_dig + x_exp - y_exp))
y_int = int(y_mant * 2**sys.float_info.mant_dig)
return x_int - y_int
print(delta(1.123456789, 1.1234567889999))
450
>>>
- 1. 在两个浮点数之间产生随机浮点数
- 2. jQuery数学两个浮点数
- 3. if语句使用&&两个浮点数?
- 4. xmm,cmp两个32位浮点数
- 5. java8结合两个浮点数
- 6. 无法比较两个浮点数
- 7. AWK比较两个科学浮点数
- 8. 在一个浮点变量中存储两个浮点值
- 9. 比较两个字典 - 浮点
- 10. 两个div浮点和宽度
- 11. 测试1个ULP中的两个浮点数ULP
- 12. Scanf为两个字符串和一个浮点数
- 13. 如何从除以两个整数得到浮点数结果
- 14. 将浮点数转换为C中的两个16位整数
- 15. 声明浮点数或浮点数吗?
- 16. 在浮点数中存储浮点数?
- 17. 如何最好地创建一个随机浮点数在两个浮点数之间的范围内
- 18. 如何将此浮点数小数点后两位小数?
- 19. 确定一个浮点数
- 20. 争夺一个浮点数?
- 21. 用一个浮点数
- 22. 将小数点后两位的浮点数与小数点后六位的浮点数相除
- 23. 将小数位数多的浮点数转换为浮点数只有一个小数位的浮点数
- 24. 将一个32位浮点数转换为两个16位浮点数,然后再转换回该32位浮点数
- 25. 如何四舍五入浮点数。到小数点后两位?
- 26. 以点两位小数对齐浮点数
- 27. 将浮点数格式化为小数点后两位
- 28. Objective c格式浮点数,逗号和小数点后两位
- 29. PyQt4 QAbstractItemModel浮点数在小数点后两位
- 30. 如何统一这两个浮点函数?
只是出于好奇,你有什么需要这些信息的呢? – 2010-08-27 20:30:29
你是什么意思?两个特定的花车或一般?你想能够从Python做到这一点,或者你想手动进行计算吗? – terminus 2010-08-27 20:30:52
我想比较两个浮点数,以确定它们是否等于接近但不等于表示精度的精度。我对使用Python做这件事很感兴趣。请参阅http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm上的AlmostEqual2sComplement函数 - 我知道我可以用(ab)/ a
astrofrog
2010-08-27 20:38:44