首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何使用像"logBase“这样的数学函数来处理无界整数?

我如何使用像"logBase“这样的数学函数来处理无界整数?
EN

Stack Overflow用户
提问于 2011-06-30 13:51:00
回答 1查看 1.1K关注 0票数 3

我正在尝试生成一个Fibonacci数的列表,以便与质数列表(例如)进行比较。这两个列表都从第一个已知的fibo/素数开始,并在第10000个结束。问题是:图形比较(图表)只有在像“FIBO2”这样的函数应用于logBase数字时才可能实现,而"logBase“只适用于(?)使用“浮点”数字。不幸的是,fibo数字变得很大,所以我认为fibo数字应该是“整数”(无界的)。

这会导致转换问题。

示例(Double versus versus ):

代码语言:javascript
复制
Prelude> (fromInteger 99^155 :: Double) 
Infinity

Prelude> 99^155
2105984461967288122980631709715261275645844225982779394351624787177327329412781425212770617487844004735075332631944629831514476725173837569097618069672639524362255333585985536520710945968603104880488606713054412670128838036813075895861981025491395960367363513228812061706617371582639821584522415306665565665499

Prelude> logBase 2 $ fromRational (fromInteger 99^155 :: Rational) 
Infinity

因此,问题是:我如何使用像"logBase“这样的数学函数来处理无界整数?有什么提示吗?

EN

回答 1

Stack Overflow用户

发布于 2011-06-30 14:49:46

如何使用log的数学属性-类似于

代码语言:javascript
复制
{-# 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只是为了确保在正确的类型上执行isInfiniteisDenormalized测试。

此外,isDenormalized不是对范围的最低端的完整测试-您想要的是既检查这一点(因为精度问题),也检查转换后的值是否为0,而未转换的值不是-但由于这个问题是关于大数的,所以它并不重要,我只是把它放进去,使我的答案更通用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6530467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档