circumference :: Float -> Float
circumference r = 2 * pi * r
ghci> circumference 4.0
25.132742
circumference' :: Double -> Double
circumference' r = 2 * pi * r
ghci> circumference' 4.0
25.132741228718345
我在Haskell中进行了测试。
这里浮点类型的精度是6位。而双精度类型的精度是15位。双精度类型的精度显然是浮点类型的两倍多。说双精度类型是浮点类型精度的两倍还正确吗?
正如卡尔在评论中所说,这更像是一个IEEE-754问题,而不是一个Haskell问题。
该标准区分了精度和尾数位。精度是用于编码数字的位数。
每个IEEE-754数字由三个元素组成:符号、指数和尾数。
如果符号始终为1位,则在将精度加倍或四倍时,尾数和指数位不采用比例位计数:
您还应该注意到,您正在比较十进制表示法的精度。IEEE-754数字基本上是二进制数(存在十进制数,但那是另一回事):
更进一步:
2.2.3 浮点数类型 float 浮点数就是包含小数点的数,大体对应于数学中的实数集合。现实世界中的职工工资(以 元为单位)、房屋面积(以平方米为单位)、人的身高(以米为单位)、圆周率等在程序中都 适合用浮点数表示。 Python 语言提供了类型 float 用于表示浮点数。float 类型的字面值形式与数学中的 写法基本一致,但是允许小数点后面没有任何数字(表示小数部分为 0),例如下列字面值
问题内容: 我很好奇为什么必须这样声明float文字: 代替 为什么默认类型是双精度类型,为什么编译器不能通过查看赋值的左侧来推断它是浮点型的?Google仅提供关于默认值的解释,而不是为什么如此。 问题答案: 为什么默认类型是双精度型? Java语言的设计者最好问这个问题。他们是唯一知道做出语言设计决定的 真正 原因的人。但我希望推理遵循以下几条原则: 他们需要区分两种类型的文字,因为从数学的角
为什么浮点数据类型的精度不与其大小成正比增长?例如: 正如您所看到的,的精度大约是精度的两倍,这是有意义的,因为的大小是。 但这与双精度和长双精度的情况不同,长双精度的大小是128位,是64位双精度的两倍,但其精度只多出三位!! 我不知道浮点数是如何实现的,但从理性的角度来看,仅为三位精度使用64位内存是否有意义?! 我四处搜索,但没有找到一个简单明了的答案。如果有人能解释为什么长双精度只比双精度
在阅读了这个问题和这个msdn博客之后,我尝试了几个例子来测试这个: 是的,预期输出为假。因此,我尝试将表达式的两侧强制转换为double和float,以查看是否可以得到不同的结果: 第一行输出但第二行输出,为什么会发生这种情况? 此外 即使没有铸造,上面的两行都给出了。和... 这一行输出。如果它们都被浮点数减去,如何从减去18.01中减去8的差异? 我试图通读博客并提出问题,但似乎在其他地方找
问题内容: 访问主窗口时,它将作为 为什么它返回为double可选,这是什么意思?如果放入a中,我应该在其后添加一个? 尽管我的第一个建议是替换为after委托,但这不是解决方案。 问题答案: @matt有详细信息,但是有一个(有点可怕,有点很棒)的解决方法。(不过请参见下面的编辑) 我会将对这一行代码的理解留给读者作为练习。 好吧,我撒谎,让我们分解一下。 好的,到目前为止很好。在这一点上,我们
Monoid函数的类型签名是: