0

这是我应该通过在中创建新方法来实现的规范Fixnum

it "reads trillions" do
    1_000_000_000_000.in_words.should == 'one trillion'
    1_000_000_000_001.in_words.should == 'one trillion one'
    1_888_259_040_036.in_words.should == 'one trillion eight hundred eighty eight billion two hundred fifty nine million forty thousand thirty six'
  end

问题是,1_000_000_000_000不被认为是 a Fixnum,而是 a Bignum

我的第一个想法是继续添加新方法Bignum

我错过了分配的重点还是有办法强制Fixnum处理这么大的数字?

在此处输入图像描述

4

2 回答 2

2

您需要一个 64 位处理器才能在Fixnum. 在 32 位处理器上,超过 0x7FFFFFFF(大约 20 亿)的所有内容都将是 Bignum。

如果这是您正在使用的,则需要修改IntegerBignum.

于 2013-10-09T16:10:03.053 回答
2

这是不可能的。Ruby 语言规范中没有任何内容可以保证某个整数适合或不适合Fixnum. 这完全取决于实现。在 YARV 上,Fixnums 是 31 位或 63 位,具体取决于处理器 ISA。在 JRuby 上,它们始终是 64 位的。在其他实现中,它们可能更大或更小,甚至两者兼而有之,具体取决于环境。

在我个人看来:Fixnums 是一种性能优化。它们根本不应该暴露给程序员。

两者都有一个抽象基类,Fixnum你应该(几乎)总是使用它。BignumInteger

于 2013-10-09T16:22:32.730 回答