gpt4 book ai didi

c++ - WxWidgets:简单的数学公式给出错误的结果?

转载 作者:太空狗 更新时间:2023-10-29 21:07:59 50 4
gpt4 key购买 nike

我非常喜欢WxWidgets,并开始在其中进行C++编程。我的示例程序将摄氏度从文本形式转换为华氏度。这是我的基本代码:

//get "100" from textbox
wxString szCelsius = TextCtrl1->GetValue();
long lCelsius;

//attempt to cast into long
szCelsius.ToLong(&lCelsius, 10);

//formula that works in normal cases to get fahrenheit
long lFahrenheit = ((9.f/5.f) * lCelsius + 32);

//SOMEHOW this works:
//long lFahrenheit = ((9.f/5.f) * 100 + 32);

//display debug info, note it displays lCelsius as 100
wxString debuginfo;
debuginfo << _T("deg C: ") << lCelsius << _T("\n");
//displays incorrectly as 211
debuginfo << _T("deg F: ") << lFahrenheit << _T("\n");
//this displays 100
std::cout << lCelsius;
//this fails though
assert(lCelsius == 100);

现在有了调试信息,lCelcius 和预期的一样是 100,但它返回华氏温度为 211 而不是 212!奇怪的是,公式在纯 C 中运行良好,当我将 lCelsius 替换为 100 时,它运行良好,即使我的调试信息清楚地表明它是 100。

你有没有发现任何明显的问题,或者我只是不能做这么简单的事情?我不太确定 Wx 做了什么使它比应有的少了一个。

编辑:包括 assert.h 和运行 lCelsius == 100 在调试器中失败,但 std::cout lCelsius 返回 100。Wx 一定有什么东西正在破坏结果但仍然是“100”..

最佳答案

值 1.8(即 9/5)不能精确地表示为二进制 float - 在二进制中,它是一个循环的数字序列(1.1100110011001100110011001100...) - 类似于 1/3 的循环方式十进制。

作为单精度浮点值的最接近表示略低于 1.8 - 大约为 1.7999999523)。当这个数字乘以 100 时,得到的值略低于 180;然后加上 32,得到的数字刚好小于 212。

将 float 转换为整数会截断小数部分,因此 211.999... 变为 211。

如果您在源代码中使用文字 100 而不是运行时提供的值,则不会发生这种情况的原因是编译器简化了表达式 (9.f/5.f) * 100 在编译时下降到普通的 180。

如果您的编译器支持 C99 roundf() 函数(在 math.h 中声明),您可以使用它来舍入到最接近的整数:

long lFahrenheit = roundf((9.f/5.f) * lCelsius + 32);

关于c++ - WxWidgets:简单的数学公式给出错误的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4132290/

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