我正在尝试生成一个Fibonacci数的列表,以便与质数列表(例如)进行比较。这两个列表都从第一个已知的fibo/素数开始,并在第10000个结束。问题是:图形比较(图表)只有在像“FIBO2”这样的函数应用于logBase数字时才可能实现,而"logBase“只适用于(?)使用“浮点”数字。不幸的是,fibo数字变得很大,所以我认为fibo数字应该是“整数”(无界的)。
这会导致转换问题。
示例(Double versus versus ):
Prelude> (fromInteger 99^155 :: Double)
Infinity
Prelude> 99^155
2105984461967288122980631709715261275645844225982779394351624787177327329412781425212770617487844004735075332631944629831514476725173837569097618069672639524362255333585985536520710945968603104880488606713054412670128838036813075895861981025491395960367363513228812061706617371582639821584522415306665565665499
Prelude> logBase 2 $ fromRational (fromInteger 99^155 :: Rational)
Infinity因此,问题是:我如何使用像"logBase“这样的数学函数来处理无界整数?有什么提示吗?
发布于 2011-06-30 14:49:46
如何使用log的数学属性-类似于
{-# LANGUAGE ScopedTypeVariables #-}
logBaseRational :: forall a . (RealFloat a, Floating a) => Rational -> Rational -> a
logBaseRational k n | isInfinite (fromRational n :: a) = logBaseRational k (n/k) + 1
logBaseRational k n | isDenormalized (fromRational n :: a) = logBaseRational k (n*k) - 1
logBaseRational k n = logBase (fromRational k) (fromRational n)如果你需要处理非常大的数字,可以做一些更有效的事情,但这应该适用于你感兴趣的范围。
使用ScopedTypeVariables只是为了确保在正确的类型上执行isInfinite和isDenormalized测试。
此外,isDenormalized不是对范围的最低端的完整测试-您想要的是既检查这一点(因为精度问题),也检查转换后的值是否为0,而未转换的值不是-但由于这个问题是关于大数的,所以它并不重要,我只是把它放进去,使我的答案更通用。
https://stackoverflow.com/questions/6530467
复制相似问题