我了解到Clojure读取器将带有后缀“M”的十进制文字面量(如1.23M)解释为BigDecimal类型。我也知道没有“M”的十进制数变成Java的double类型。
但我认为更好的方法是让普通的十进制数成为BigDecimal类型,而依赖主机的小数则添加后缀,例如1.23H。这样,当数字因IEEE double的精度限制而被损坏或截断时,我们可以轻松注意到数字的精度受限。此外,我认为更易于表达的方式应该是独立于主机的。
除了时间性能之外,Clojure将字面十进制解释为Java double类型是否有其他原因?我不认为时间性能是一个答案,因为它不是C/C++,声明依赖于主机的十进制数的其他方法可以像“1.23H”一样实现。
但我认为更好的方法是让普通的十进制数成为BigDecimal类型,而依赖主机的小数则添加后缀,例如1.23H。这样,当数字因IEEE double的精度限制而被损坏或截断时,我们可以轻松注意到数字的精度受限。此外,我认为更易于表达的方式应该是独立于主机的。
除了时间性能之外,Clojure将字面十进制解释为Java double类型是否有其他原因?我不认为时间性能是一个答案,因为它不是C/C++,声明依赖于主机的十进制数的其他方法可以像“1.23H”一样实现。
*
运算符时会自动将long类型升级为BigInt。然而,当我键入(*' 1e200 1e200)
和(*' 1e-200 1e-200)
时,REPL只会输出Infinity
和0.0
。为什么这些自动升级函数不支持double类型呢? - burrownn1e200
是一个浮点数常量而不是整数。如果你想要进行这个乘法运算,你可以通过将浮点数值转换为BigInt来实现:(*' (bigint 1e200) (bigint 1e200))
,这将产生1(400个零)N
。 - Bob Jarvis - Слава Україні