我正在尝试计算Haskell中整数的长度,使用这样一个事实:长度等于truncate (log10(x)+1)
。
我使用整数创建了以下内容:
len :: Integer -> Integer
len i = toInteger (truncate (logBase 10 (fromIntegral i)) + 1)
不幸的是,并非所有数字都有正确的长度。 我尝试了几种不同情况,发现:
logBase 10 10 = 1.0
logBase 10 100 = 2.0
logBase 10 1000 = 2.9999..6
logBase 10 10000 = 4.0
logBase 10 100000 = 5.0
logBase 10 1000000 = 5.9999999
为什么logBase 10 1000
的结果不是3.0呢?我该如何在以10为底的情况下获得正确的1000的对数值?
log
不是必需的,您可以通过重复除以10(和更高次幂的10)来避免浮点运算。 - kennytmnumbers
包,并调用logBase 10 1000 :: BigFloat Prec50
,然后将其舍入为浮点数或双精度浮点数。 这是最简单的方法,但不一定是最好的。 - Bartek Banachewicz