gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:24:35 27 4
gpt4 key购买 nike

我正在尝试生成斐波那契数列以与素数列表进行比较(例如)。两个列表都从第一个已知的 fibo/prime 数字开始,到第 10000 个结束。问题是:图形比较(图表)只有在某些函数(如“logBase 2”)应用于斐波纳奇数时才有可能,但“logBase”仅适用于(?)“ float ”数字。不幸的是,fibo 数字变得很大,所以我认为 fibo 数字应该是“整数”(无界)。

这会导致转换问题。

示例( double 与整数与有理数):

Prelude> (fromInteger 99^155 :: Double) 
Infinity

Prelude> 99^155
2105984461967288122980631709715261275645844225982779394351624787177327329412781425212770617487844004735075332631944629831514476725173837569097618069672639524362255333585985536520710945968603104880488606713054412670128838036813075895861981025491395960367363513228812061706617371582639821584522415306665565665499

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

因此,问题:我怎样才能使用像“logBase”这样的数学函数来处理无界整数?一些提示?

最佳答案

如何使用 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 只是为了确保 isInfiniteisDenormalized 测试以正确的类型完成。

此外,isDenormalized 不是对范围底端的完整测试 - 您想要的是同时检查(由于精度损失问题)以及转换后的值是否为0 当未转换的值不是时 - 但由于这个问题是关于大数字的,所以它并不重要,我只是把它扔进去让我的回答更笼统。

关于Haskell:如何使用像 "logBase"这样的数学函数来处理无界整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6530467/

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