【发布时间】:2016-02-08 15:33:48
【问题描述】:
我有以下代码...
ran_int = rand(); //check READ ME Citation B
if (input == 32){
//rand() with 2^31 as lower limit and 2^32 as its upper
long long int upper_limit = 4294967295;
long long int lower_limit = 2147483649
ran_32_64 = (rand() * 2) % (upper_limit - lower_limit);
ran_32_64 += lower_limit;
}
else if(input == 64){
//rand() x 4 with 2^63 as lower limit and 2^64 as its upper
unsigned long long int upper_limit = powl(2, 64);
long long int lower_limit = powl(2, 63);
ran_32_64 = (rand() * 4) % (upper_limit - lower_limit);
ran_32_64 += lower_limit;
}
else if(input == 128){
//rand() x 8 with 2^127 as lower limit
unsigned _int128 upper_limit =
}
对于最后一个块,我需要表示一个 128 位二进制数。我知道我可以将类型 _int128 用于 128 位值,但这并不完全准确。
所以我想完全准确地说我可以使用双精度类型,但我找不到任何关于 128 位双精度类型的文献。
有什么想法吗?
【问题讨论】:
-
你应该对浮点数做一些研究。实际上,整数是精确的,而浮点不是!而且
_int128无论如何都不是标准类型。 -
C 中数字类型的大小、范围和表示取决于平台;大概您的平台不提供 128 位浮点类型。
-
unsigned long long int upper_limit = powl(2, 64);的结果不适合 64 位无符号变量。您需要一个 128 位变量来存储它。 -
如果你试图做 2 的整数幂,你可以使用左移运算符。不过,请确保不要将其右移其类型的宽度或更多。
-
而不是
powl(2, 63),而是使用1LL << 63。powl(2, 64)应该是__int128(1) << 64
标签: c types binary double 128-bit