gpt4 book ai didi

c++ - 双溢出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:18 25 4
gpt4 key购买 nike

我一直想知道如果 double 达到它的最大值会发生什么,所以我决定写这段代码:

#include <stdint.h>
#include <iostream>
#define UINT64_SIZE 18446744073709551615
int main() {
std::uint64_t i = UINT64_SIZE;
double d1 = ((double)(i+1)) / UINT64_SIZE;
double d2 = (((double)(i)) / UINT64_SIZE)*16;
double d3 = ((double)(i * 16)) / UINT64_SIZE;

std::cout << d1 << " " << d2 << " " << d3;
}

我期待这样的事情:

0 16 0 

但这是我的输出:

0 16 1 

这是怎么回事?为什么 d3d1 的值不同?

编辑:

我决定将我的代码更改为这样以查看结果:

#include <stdint.h>
#include <iostream>
#define UINT64_SIZE 18446744073709551615
int main() {
std::uint64_t i = UINT64_SIZE;
double d1 = ((double)(i+1.0)) / UINT64_SIZE; //what?
double d2 = (((double)(i)) / UINT64_SIZE)*16;
double d3 = ((double)(i * 16.0)) / UINT64_SIZE;

std::cout << d1 << " " << d2 << " " << d3;
}

我现在得到的结果是这样的:

1 16 16 

但是,d1d3 不应该仍然是相同的值吗?

最佳答案

double 溢出是因为失去精度,而不是从 0 开始(因为它适用于无符号整数)

d1

因此,当您将 1.0 添加到非常大的值 (18446744073709551615) 时,您不会在 double 中得到 0,而是像 18446744073709551610(注意最后 10 而不是 15)或 18446744073709551620(注意最后20 而不是 15),因此 - 不太重要的数字被四舍五入。

现在,您将两个几乎相同的值相除,结果将是 0.9(9)9 或 1.0(0)1,只要 double 不能容纳如此小的值 - 它又会丢失精度并舍入到 1.0。

d3

几乎相同,当您将巨大的值乘以 16 时 - 您会得到四舍五入的结果(不太重要的数字被丢弃),通过潜水 - 您会“几乎”得到 16,四舍五入为 16。

关于c++ - 双溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41492080/

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