2 c++ python floating-point haskell
首先,我不是用英语学习数学,所以我可能会在文本中使用错误的单词.
浮点数可以是有限的(42.36)和无限的(42.363636 ...)
在C/C++中,数字存储在基数2中.我们的思想在10号基地运行浮标.
问题是 -
many (a lot, actually) of float numbers with base 10, that are finite, have no exact finite representation in base 2, and vice-versa.
这在大多数时候并不意味着什么.double的最后一位可能会偏离1位 - 这不是问题.
当我们计算两个实际上是整数的浮点数时会出现问题.99.0/3.0在C++上可以产生33.0和32.9999...99.如果你将它转换为整数然后 - 你会感到惊讶.出于这个原因,我总是在C中向上舍入之前添加一个特殊值(给定类型和体系结构的2*最小值).我应该用Python做吗?
我已经在Python中运行了一些测试,看起来浮点除法总是按预期结果.但是一些测试还不够,因为问题依赖于架构.有人确切知道它是否被照顾,以及在什么级别 - 浮动类型本身或仅在舍入和缩短功能?
PS如果有人可以为Haskell澄清同样的事情,我只是开始 - 它会很棒.
UPDATE
乡亲们指出了一份正式文件,说明有是在浮点运算的不确定性.剩下的问题是-做math类似的功能ceil照顾他们或者我应该做我自己?此必须指出的每一个我们讲的这些功能,时间的初级用户,因为否则会在该问题的所有蹒跚.
用于表示float和double的格式C和C++是标准化的(IEEE 754),并且您描述的问题是该表示中固有的.由于Python是用C实现的,因此它的浮点类型容易出现相同的舍入问题.
Haskell的Float和Double是一个更高级别的抽象,但由于大多数(所有?)现代CPU使用IEEE754进行浮点计算,因此您很可能也会遇到这种舍入错误.
换句话说:只有选择不将其浮点类型基于底层架构的语言/库可能能够在一定程度上规避IEEE754舍入问题,但由于底层硬件不直接支持其他表示,因此必须是性能惩罚.因此,大多数语言可能会坚持这一标准,尤其是因为它的局限性是众所周知的.