Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;“长双大”;“安全”;整数_C++_Numbers - Fatal编程技术网

C++ C++;“长双大”;“安全”;整数

C++ C++;“长双大”;“安全”;整数,c++,numbers,C++,Numbers,IEEE 754数字的间隔不均匀,数字越大,两个连续可表示数字之间的差值越大。 我认为我的长双关的大小是C++ 16字节。那么,用这种类型表示的更大的“安全”整数“n”是什么呢?。 如果n-1可以表示,但n+1不能表示,我称之为“安全”。IEEE 754标准定义了各种数值类型的参数: 对于长度为128位的长双精度整数,尾数(浮点数中包含有效数字的部分)为113位,因此它可以表示精度高达2^113-1的整数。它可以表示较大的浮点数,但是由于它的下级数刚好舍入,所以你开始失去精度,在C++中,可以使

IEEE 754数字的间隔不均匀,数字越大,两个连续可表示数字之间的差值越大。 我认为我的长双关的大小是C++ 16字节。那么,用这种类型表示的更大的“安全”整数“n”是什么呢?。
如果n-1可以表示,但n+1不能表示,我称之为“安全”。IEEE 754标准定义了各种数值类型的参数:

对于长度为128位的长双精度整数,尾数(浮点数中包含有效数字的部分)为113位,因此它可以表示精度高达2^113-1的整数。它可以表示较大的浮点数,但是由于它的下级数刚好舍入,所以你开始失去精度,在C++中,可以使用很多信息。例如:

#include <limits>
#include <iostream>
#include <iomanip>

int main() {
  auto p = std::numeric_limits<long double>::max_digits10;
  std::cout << "Max Long Double: "
            << std::setprecision(p)
            << std::setw(p + 7)
            << std::numeric_limits<long double>::max()
            << std::endl;
}

据我所知,你问的是哪一个是最大的连续精确表示整数。确切地说:

std::pow(std::numeric_limits<long double>::radix, std::numeric_limits<long double>::digits)
std::pow(std::数值限制::基数,std::数值限制::数字)
或用数学表示:radixdigits,其中(引用自)

std::numeric\u limits::radix
的值是用于表示类型的数字系统的基础。对于所有二进制数字类型,它是2,但对于IEEE 754十进制浮点类型,它可能是10

std::numeric\u limits::digits
的值是基本基数中的位数,它可以由类型T表示,而不需要更改。。。对于浮点类型,这是尾数中的位数


IEEE浮点类型的所有大的可表示值都是整数。谢谢@AnT,你是对的,但我刚刚更新了问题:),碰巧n-1必须能够表示。@JoseLuisPalacios n-2是否需要能够表示?@user2079303是的,但你可以假设如果n-1能够表示,n-2是可能的,因为假设不适用于否定,但问题似乎是关于肯定的。谢谢,但遗憾的是:(numeric_limits::max()==numeric_limits::max()-1.0)是真的。因此,numeric_limits::max()不安全:(你还指望什么呢?
1.1897314955723176502e+4932
之后的下一个向零的数字是
1.1897314953723176496e+4932
。这就是浮点运算的工作原理。结果是
n-1
必须能够表示。
1.1897314935723176502e+4932
之后的下一个数字向零(
1.18973149535723176496e+4932
)不是
1.18973149535723176502e+4932-1.0
。提前感谢。对于IEEE双精度,有效位最多可以有53位,因此2^53是适合(9007199254740992)的最大整数。对于长双精度,这取决于它的表示方式。如果它是一个扩展精度的80位数字,有效位为64位,那么它是2^64(18446744073709551616)。@user2079303的答案描述了如何使用
查询有效位的大小。谢谢,是的,这就是我要找的数字。
std::pow(std::numeric_limits<long double>::radix, std::numeric_limits<long double>::digits)