gpt4 book ai didi

Haskell 日志库错误

转载 作者:行者123 更新时间:2023-12-04 12:20:31 25 4
gpt4 key购买 nike

我正在尝试使用长度等于 truncate (log10(x)+1) 的事实来计算 Haskell 中整数的长度。 .

使用我创建的整数:

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 的正确对数值?

最佳答案

GHC 模块中有一个整数对数基函数,其类型为 Integer -> Integer -> Int#。 .

示例用法:

{-# LANGUAGE MagicHash #-}

import Control.Monad
import GHC.Integer.Logarithms ( integerLogBase# )
import GHC.Exts (Int(..))

main = do
forM_ [(1::Int)..20] $ \n -> do
let a = 10^n-1
la = I# (integerLogBase# 10 a)
b = 10^n
lb = I# (integerLogBase# 10 b)
putStrLn $ show a ++ " -> " ++ show la
putStrLn $ show b ++ " -> " ++ show lb

输出:
9 -> 0
10 -> 1
99 -> 1
100 -> 2
999 -> 2
1000 -> 3
9999 -> 3
10000 -> 4
99999 -> 4
100000 -> 5
999999 -> 5
1000000 -> 6
9999999 -> 6
...
9999999999999999999 -> 18
10000000000000000000 -> 19
99999999999999999999 -> 19
100000000000000000000 -> 20

关于Haskell 日志库错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26844123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com