甚至代码块的意外行为(mingw32g++)
evenUnexpected behaviour from Code Blocks (mingw32-g++ )
我正在写一些函数来转换整数的基数,我在Ideone上使用这个代码
虽然它在Ideone上工作得很好,但在C::B上它给出了输出484
。我用的是-std=c++11
,即使没有它(或使用-std=c++0x
),输出仍然不正确。那么这是代码或编译器的问题吗?
我在windows上使用mingw (gcc 4.7.1)
#include<iostream>
#include<cmath>
#define bigint long long unsigned int
bigint base(int numberOldBase, int newBase)
{
bigint numberNewBase = 0;
int digitCounter = 0, remainder[100];
while (numberOldBase)
{
remainder[digitCounter] = numberOldBase % newBase;
numberOldBase /= newBase;
digitCounter++;
}
for (int currentDigit = 0; currentDigit < digitCounter; currentDigit++)
{
numberNewBase += ((remainder[currentDigit]) * pow(10, currentDigit));
}
return numberNewBase;
}
int main()
{
std::cout << base(1025, 15);
return 0;
}
不准确的原因是浮点数不精确,如果在某些点上得到484.99999995,它在转换为int
时被截断为484。在这种情况下,你应该把自己限制在整数算术,因为它会更快,并摆脱浮点数的不准确性。
bigint curExp = 1;
for (int currentDigit = 0; currentDigit < digitCounter; currentDigit++)
{
numberNewBase += remainder[currentDigit] * curExp;
curExp *= 10;
}
详细分析
numberNewBase += ((remainder[currentDigit]) * pow(10, currentDigit));
被解释为
numberNewBase = (float)numberNewBase + (((float)remainder[currentDigit]) * pow(10, currentDigit));
会导致大小浮点数相加的情况(这会导致更大的舍入误差)。
numberNewBase += (int)((remainder[currentDigit]) * pow(10.0, currentDigit));
方法通过在添加
之前将其转换为int来帮助缓解这个问题numberNewBase = numberNewBase + (int)(((float)remainder[currentDigit]) * pow(10, currentDigit));
但是,使用top方法可以完全避免float转换
相关文章:
- 在C++中对T*类型执行std::move的意外行为
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 使用vscode调试时,GDB意外退出
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- C++中意外的多头值
- vector.size() 在比较中意外工作
- 使用 malloc() 时出现意外大小
- 多线程程序中出现意外的内存泄漏
- 为什么static_cast基础类型的枚举类int8_t获得意外值?
- 字符串比较中的意外输出
- 我的代码中的意外价值以及我如何修复它
- 甚至代码块的意外行为(mingw32g++)