考虑以下:
print 3 ** 333; #Yields 7.6098802313206e+158
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:在处理非常大的数字时,如何禁用科学记数法?基本上,我希望看到所有数字stdout逐字逐句转储.
这可能吗?
API文档说
有关溢出的规范中的所有细节都将被忽略,因为BigIntegers的大小可以根据操作的结果进行调整.
这是否意味着假设您有足够的可用内存,BigInteger永远不会溢出?如果是这样的话,为什么我们让一些"类型"溢出而一些不会?
随着语言的发展,它是否会偏向程序员隐藏溢出机制的类型?
在Java中,大多数基本类型都是有符号的(一位用于表示+/-),因此当我超出类型的限制时,我会得到意想不到的结果,比如负数.
有没有比使用BigInteger更好的解决方案,因为BigInteger存在性能问题,您需要使用类方法进行基本算术而不是语言运算符(废弃可读性)?
我正在编写一个需要在C#中准确划分BigInteger类的类.
例:
BigInteger x = BigInteger.Parse("1000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
BigInteger y = BigInteger.Parse("2000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
x /= y;
Console.WriteLine(x.ToString());
//Output = 0
Run Code Online (Sandbox Code Playgroud)
问题是作为一个整数,自然它不包含十进制值.我怎样才能克服这一点,得到0.5的实际结果(给出的例子).
PS解决方案必须能够准确地划分任何BigInteger,而不仅仅是示例!
我正在努力理解big int api背后的设计决策.
例如,要添加两个大的int,您必须:
a := big.NewInt(10)
b := big.NewInt(20)
c := big.NewInt(0)
d := c.Add(a,b)
Run Code Online (Sandbox Code Playgroud)
其中d与末尾的c相同.初始零点无关紧要.
为什么不呢:
a := big.NewInt(10)
b := big.NewInt(20)
c := big.Add(a,b)
Run Code Online (Sandbox Code Playgroud)
或者更好的是:
a := big.NewInt(10)
b := big.NewInt(20)
c := a.Add(b)
Run Code Online (Sandbox Code Playgroud)
他们选择这样做有什么理由吗?我发现它有点令人困惑,每当我使用它时都要查找它.
我有以下代码创建一个非常大的数字(BigInteger),然后转换为string.
// It's a console application.
BigInteger bi = 2;
for (int i = 0; i < 1234; i++)
{
bi *= 2;
}
string myBigIntegerNumber = bi.ToString();
Console.WriteLine(myBigIntegerNumber);
Run Code Online (Sandbox Code Playgroud)
我知道,为了转换到int我们可以使用Convert.ToInt32和转换为long我们使用Convert.ToInt64,但是转换BigInteger为什么?
我怎样才能将string(代表一个非常长的数字)转换成BigInteger?
如何提高Java的Big Integer的性能?
例如,这个阶乘程序:
import java.math.*;
class Fac {
public static void main(String[] args) {
BigInteger i = BigInteger.ONE;
for(BigInteger z=BigInteger.valueOf(2);z.compareTo(BigInteger.valueOf(99999)) != 0;) {
i = i.multiply(z);
z = z.add(BigInteger.ONE);
}
System.out.println( i );
}
}
Run Code Online (Sandbox Code Playgroud)
该计划在31.5s 完成
C++中的位置:
#include <iostream>
#include <gmpxx.h>
using namespace std;
int main() {
mpz_class r;
r = 1;
for(int z=2;z<99999;++z) {
r *= mpz_class(z);
}
cout << r << endl;
}
Run Code Online (Sandbox Code Playgroud)
在1.0s 完成
和Ruby(用于比较):
puts (2...99999).inject(:*)
Run Code Online (Sandbox Code Playgroud)
在4.4s(Ruby)和32.2JRuby中完成 …
我需要使用大数字(在1E100 - 1E200范围内).但是,BigInteger该类似乎通常是合适的,在初始化期间不识别科学格式的字符串,也不支持转换为格式的字符串.
BigDecimal d = new BigDecimal("1E10"); //works
BigInteger i1 = new BigInteger("10000000000"); //works
BigInteger i2 = new BigInteger("1E10"); //throws NumberFormatException
System.out.println(d.toEngineeringString()); //works
System.out.println(i1.toEngineeringString()); //method is undefined
Run Code Online (Sandbox Code Playgroud)
有办法吗?我无法想象这样的类的设计是假设用户必须输入数百个零.
在红宝石中,一些大数字大于无穷大.通过二进制搜索,我发现:
(1.0/0) > 10**9942066.000000001 # => false
(1.0/0) > 10**9942066 # => true
RUBY_VERSION # => "2.3.0"
Run Code Online (Sandbox Code Playgroud)
为什么是这样?10 9942066有什么特别之处?它似乎不是像9999999这样的任意数字,它不接近任何两个的幂(它与2 33026828.36662442大致相等).
为什么红宝石的无限无限?10 9942066如何参与?
我现在意识到,任何大于10 9942066的数字都会溢出到无穷大:
10**9942066.000000001 #=> Infinity
10**9942067 #=> Infinity
Run Code Online (Sandbox Code Playgroud)
但这仍然留下了一个问题:为什么10 9942066?