gpt4 book ai didi

Ruby 和标准输入整数

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:19 26 4
gpt4 key购买 nike

我有:

$ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]

假设你有一个整数序列 1..n ruby​​ 新手会像这样对序列求和:

$ ruby -e 's=0
for i in 1..500000
s+=i
end
puts s'
125000250000

现在假设我有来自 stdin 的相同序列:

$ seq 1 500000 | ruby -lne 'BEGIN{s=0}
s+=$_.to_i
END{puts s} '
125000250000

到目前为止一切顺利。

现在将终值从 500,000 增加到 5,000,000:

$ ruby -e 's=0
for i in 1..5000000
s+=i
end
puts s'
12500002500000 <=== CORRECT

$ seq 1 5000000 | ruby -lne 'BEGIN{s=0}
s+=$_.to_i
END{puts s} '
500009500025 <=== WRONG!

它产生不同的总和。

awkperl 都以相同的序列产生正确的结果:

$ seq 1 5000000 | awk '{s+=$1} END{print s}'
12500002500000
$ seq 1 5000000 | perl -nle '$s+=$_; END{print $s}'
12500002500000

为什么 ruby​​ 产生的总和不正确?我不认为它是溢出,因为 awkperl 在同一输入上正常工作。


结论:

感谢 David Aldridge 诊断此问题。

  1. OS X 和 BSD seq 转换为 1,000,000 的浮点输出,而 GNU seq 支持任意精度整数。 OS X seq 作为大于 1,000,000 的整数源是无用的。 OS X 上的示例:

    $ seq  999999 1000002
    999999
    1e+06
    1e+06
    1e+06
  2. ruby 方法 .to_i 默默地将部分字符串转换为整数,这就是本例中的“错误”。示例:

    irb(main):002:0> '5e+06'.to_i
    #=> 5
  3. 脚本中的“正确”行是使用 $_.to_f.to_i 来使用 float 或使用 Integer($_) 来没有脚本静默失败。 awkperl 将 5e+06 解析为 float,而 ruby 不会隐式:

    $ echo '5e+06' | awk '{print $1+0}'
    5000000
    $ echo '5e+06' | ruby -lne 'print $_.to_i+0'
    5
  4. 感谢 Stefan Schüßler 打开 Ruby feature request关于 .to_i 行为。

最佳答案

我不确定这是 100% 的答案,但我注意到:

seq 500000 500001 | ruby -lne 'BEGIN{}
puts $_
END{} '
500000
500001

...但是...

seq 5000000 5000001 | ruby -lne 'BEGIN{}
puts $_
END{} '
5e+06
5e+06

...所以#to_i 将值转换为整数所采用的“宽松”方法仍然有效...

seq 5000000 5000001 | ruby -lne 'BEGIN{}
puts $_.to_i
END{} '
5
5

...但是更严格的#to_int 不会

seq 5000000 5000001 | ruby -lne 'BEGIN{}
puts $_.to_int
END{} '
-e:2:in `<main>': undefined method `to_int' for "5e+06":String (NoMethodError)

编辑:我也注意到了:

seq 5000000 5000001

5e+06
5e+06

因此必须将 -f 标志传递给 seq 以获得整数格式。

再次编辑:

最终答案:

seq -f %f 1 5000000 | ruby -lne 'BEGIN{s=0}
s+=$_.to_i
END{puts s} '

12500002500000

关于Ruby 和标准输入整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44806216/

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