我不是程序员,我只想在空闲时间写一些代码!我曾经在python3中编程,现在我正在尝试学习苹果的Swift。我的问题:
在python3中,我使用了没有问题的真正巨大的数字,如10 ** 1000,我可以打印它们,用它们做数学运算,等等。在Swift中,我不能这样做,因为从10 ** 300或10 ** 400开始,Double和Float类型都给出了#34; + infinity"因此,我无法打印它,也不能用它进行任何操作......
我该如何解决这个问题? (PS。如果有人有兴趣,我会尝试做一些ProjectEuler的问题!http://projecteuler.net)提前谢谢你,对不起我可能有女佣的错误,我很抱歉不是英语,而且这是我第一次参加StackOverflow!
答案 0 :(得分:7)
我正在使用BigNumber库,您可以使用它来进行一些巨大的数字计算。实际上该库基于GNU多精度(GMP)库,我编写了一个Objective-C / Swift包装器。目前大整数数学,包括很多运算符重载,都是可能的。代码示例如下:
var err : NSError?
var bi1 = BigInt(nr: 12468642135797531)
var bi2 = BigInt(nr: "12345678901011121314151617181920", error: &err)
var res = bi1 * bi2
println("Multiply 2 BigInts: bi1 * bi2 = \(res.toString())")
导致:
Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520
我希望图书馆(参见:https://github.com/githotto/osxgmp)对您有用。
答案 1 :(得分:0)
如果您知道(或愿意学习)如何实现bignumber,请在swift中定义您自己的类型(可能是作为结构),然后实现算术运算符+, - 等的重载以及您需要的任何其他内容与那些大数据合作。
在C ++ here中有一个实现,但如果你稍微google一下,你可能会发现其他算法可以转换成快速代码,或者其他语言中的示例(如果你不熟悉C ++)< / p>
Swift已经定义了名为Float80
和Float96
的2个“扩展”浮点类型:
Float80 80 bit MacOS float: 1 sign bit, 15 exponent bits, 1 integer bit, 63 fraction bits
Float96 96 bit 68881 float: 1 sign bit, 15 exponent bits, 16 pad bits, 1 integer bit, 63 fraction bits
但显然没有定义运算符重载 - 它们只是“孤立的”结构。