gpt4 book ai didi

C++ 不正确的算术结果

转载 作者:行者123 更新时间:2023-11-28 02:43:15 24 4
gpt4 key购买 nike

我正在使用适用于桌面的 Visual Studios Express 编写程序。程序中给我带来麻烦的部分是取一个 2^32 的分数的十六进制值并将其转换为整数值,并使用以下编程位对其执行一些简单的数学运算(乘法和除法)。

    if (ch == 'z')
{
std::string r, d;
unsigned int ra;
unsigned int dec, n = 1;
r = readline;
while (n < 9)
{
r = r + buffer[0];
n++;
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
}
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
n++;
while (n > 9 && buffer[0] != '#')
{
d = d + buffer[0];
n++;
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
}
std::cout << "\n hex RA=" << r << " Hex Dec=" << d << "\n";



std::stringstream ss,dd;
ss << std::hex << r;
ss >> ra;
dd << std::hex << d;
dd >> dec;

std::cout << "\n ra=" << ra << " dec=" << dec << "\n";
double RA = (ra * 86400);
double DEC = (dec * 1296000);

std::cout << "\n RA=" << RA << " DEC=" << DEC << "\n";
double rRA = (RA / pow(2,32));
double dDEC = (DEC / pow(2,32));

std::cout << "\n RA=" << rRA << " DEC=" << dDEC << "\n";
}

我得到以下输出:

 hex RA=1180C1E00 Hex Dec=0EA8A900

ra=3435973836 dec=245934336

RA=4294898176 DEC=1376419840

RA2=0.999984 DEC2=0.320473

正确的值应该是:(* 在不正确的值旁边)

 hex RA=1180c1e00  HEX Dec=0ea8a900

*ra=4698414592 dec=245934336

*RA=40594302074880 *DEC=318730899456000

*RA2=94515.9748... *DEC2=74210.3204727...

我认为使用 long int 可能会解决问题,但它给出了相同的结果。我还尝试使用 double 类型来给出同样奇怪的结果。如果您还可以解释为什么一个十六进制转换有效而另一个无效,我将不胜感激。我是 C++ 的新手,我意识到在阅读许多 C++ 教程时可能会遗漏一些警告。 (注意 dec 是偏角,不是小数,与代码无关)。

最佳答案

显然,您正在使用 unsigned int 为 32 位大的平台。 0x1180C1E00 不适合 32 位。 ss >> ra 在尝试解析此字符串时遇到溢出,但失败了。 ra 保持未初始化;对它的任何进一步操作都会表现出未定义的行为。

还有,改变

double DEC = (dec * 1296000);

double DEC = (dec * 1296000.0);

如前所述,您对两个整数执行算术运算,然后将结果转换为 double 值。但结果不适合 unsigned int,并且在转换之前围绕模 2^32 进行包装。我建议的更改是将 dec 转换为 double,然后执行浮点乘法。


对于 MSVC,unsigned long 是 32 位大,就像 unsigned int 一样。在周围使用 unsigned long long 应该会有所帮助 - 它是 64 位大。

关于C++ 不正确的算术结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25232968/

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