gpt4 book ai didi

c++ - Visual Studio 中的 long long 值

转载 作者:可可西里 更新时间:2023-11-01 15:38:26 32 4
gpt4 key购买 nike

我们知道 -2*4^31 + 1 = -9.223.372.036.854.775.807,您可以在 long long 中存储的最低值,如这里所述:What range of values can integer types store in C++ .所以我有这个操作:

#include <iostream>

unsigned long long pow(unsigned a, unsigned b) {
unsigned long long p = 1;
for (unsigned i = 0; i < b; i++)
p *= a;
return p;
}

int main()
{
long long nr = -pow(4, 31) + 5 -pow(4,31);
std::cout << nr << std::endl;
}

为什么显示 -9.223.372.036.854.775.808 而不是 -9.223.372.036.854.775.803?我正在使用 Visual Studio 2015。

最佳答案

这是一个非常讨厌的小问题,有三个(!)原因。

首先有个问题就是浮点运算是近似的。如果编译器选择 pow函数返回 float 或 double,那么 4**31 太大以至于 5 小于 1ULP(最小精度单位),所以添加它什么都不做(换句话说,4.0**31+5 == 4.0**31 ).乘以 -2 可以无损地完成,结果可以存储在 long long 中。不失为错误答案:-9.223.372.036.854.775.808。

其次,标准 header 可以包含其他标准 header ,但这不是必需的。显然,Visual Studio 的 <iostream> 版本包括 <math.h> (它在全局命名空间中声明了 pow),但 Code::Blocks 的版本没有。

第三,OP 的 pow函数未被选中,因为他传递参数 4 , 和 31 , 它们都是 int 类型, 并且声明的函数具有 unsigned 类型的参数.自 C++11 以来, std::pow 有很多重载(或函数模板) .这些都返回 floatdouble (除非参数之一的类型为 long double - 此处不适用)。

因此 std::pow 的过载将是一个更好的匹配......具有双返回值,我们得到浮点舍入。

故事的寓意:不要编写与标准库函数同名的函数,除非您真的知道自己在做什么!

关于c++ - Visual Studio 中的 long long 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41043173/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com