- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我计算斐波那契数“长度”(即位数)的方法在第 1474 次迭代后失败。我获得预期结果的方法可能非常笨拙,所以如果我的方法有缺陷,请告诉我。我怀疑在无限范围内运行 block 方法直到它偶然发现答案是相当浪费的,但在这个阶段它是我得到的最好的。不过,我当然想做得更好。
对于小于以下数字的数字,它可以完美运行,直到到达第 1474 个数字:
49922546054780146353198579531352153533212840109029466994098142197617303359523104269471455390562835412104406019654730583800904132982935807202575490044075132631203284854890505808877430837618493577512703453928379390874730829906652067545822236147772760444400628059249610784412153766674534014113720760876471943168
然后返回这个错误:
FloatDomainError: Infinity
我的方法是这样的:
首先,我使用标准公式获取斐波那契数列中的“第 n 个”数:
def fibonacci_index(n)
((1 / Math.sqrt(5)) * ((1 + Math.sqrt(5)) / 2) ** (n + 1)).round(0)
end
然后我将输出转换为字符串并测量其长度:
def fibonacci_index_length(n)
fibonacci_index(n).to_s.length
end
最后我创建了一个无限范围并在while循环中运行了一个block方法:
def find_fibonacci_index_by_length(integer)
# Range to infinity because I don't want to
# limit the size of the numbers I work with
infinity = 1.0 / 0.0
range = (1..infinity)
# while loop to run through the range
running = true
while running
range.each do |n|
f_index = n + 1
f_number = fibonacci_index(n)
f_length = fibonacci_index_length(n)
if fibonacci_index_length(n) == integer && fibonacci_index(n) != 1
puts "f_index: #{f_index}"
puts "f_number: #{f_number}"
puts "f_length: #{f_length}"
running = false
# This breaks from the block
return f_index
elsif fibonacci_index_length(n) == integer && fibonacci_index(n) == 1
running = false
return 1
else
# puts "Still looking, number is #{fibonacci_index(n)}"
puts "Still looking, Fibonacci index: #{f_index}"
puts f_number
end
end
end
end
最佳答案
在 Ruby 中,与任何浮点系统一样,有一个可以表示的最大值。您那里有一个 308 位数字, float 的最大值是 Float::MAX
或 1.7976931348623157e+308
。
如果您想避免该问题,则需要使用整数数学来执行此操作。 Ruby 的“bignum”系统可以处理多达数百万位的任意长度数字,但请注意,它们越大,性能就越差。
这是一个未优化的替换:
def fibonacci_index(n)
a = [ 1, 1 ]
while (a.length < n)
a << (a[-1] + a[-2])
end
return a[-1]
end
值得注意的是,您的基于 float 的计算与任何与 float 学有关的计算都是近似值而不是精确值。每当使用浮点值进行数学运算时,记住这一点绝对至关重要。这对于流体动力学模拟或足够接近的 3D 渲染之类的东西来说很好。对于像这样每个数字都很重要的事情,或者精度错误可能导致数千或数百万美元的金钱损失的货币情况,不是好的。
这是您计算出的数字与使用可靠整数数学暴力计算的数字相比:
4992254605477767835147644879936483062623238506802202927705709236175156181701079...
4992254605478014635319857953135215353321284010902946699409814219761730335952310...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
您可以看到这两个值大相径庭。
关于Ruby "FloatDomainError: Infinity"计算斐波那契数列时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023864/
我是一名优秀的程序员,十分优秀!