gpt4 book ai didi

c++ - 有人可以解释为什么我的程序收到 std::length_error 错误吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:59 29 4
gpt4 key购买 nike

因此,我为作业编写了一个程序,内容是使用 IEEE 格式将 float 转换为科学基数 2。当我用程序在我的计算机上运行它时,教授让我们运行的测试通过了,但是当我收到作业时,他说程序在所有测试中都遇到了这个错误。

 WARNING-tester.py-152- /home/matthew/scratch/scientificFloating.out for the following 
reasons:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create

当我研究这个错误时,它说 in 可能是由于字符串长度无效,但我不知道它在我的代码中的什么位置,因为它在我的计算机上运行良好。

这是我的代码。任何帮助将不胜感激。

#include <iostream>
#include <bitset>
#include <string>
using namespace std;

int main()
{

int sign, mantissa, exponent, mantlen, count, zeropos;
float number;
unsigned int* ptr = (unsigned int*)&number;
string binary;

cout << "Please enter a float: ";
cin >> number;

sign = *ptr >> 31;
exponent = (*ptr &0x7f800000) >> 23;
exponent -= 127;
mantissa = *ptr &0x007fffff;
mantlen = 23;
binary = bitset<23>(mantissa).to_string();

for (int i = 1; i <= mantlen; i++) {

if ((binary.compare(binary.size()-i, 1, "0")) == 0) {
count++; }
else {
break; } }

zeropos = mantlen - count;
binary.erase(binary.begin()+zeropos, binary.end());

if (sign == 1) {
cout << "-"; }

if (number == 0) {
cout << "0" << "E" << "0" << endl; }
else {
cout << "1." << binary << "E" << exponent << endl; }

return 0;

}

最佳答案

您的代码中有几个未定义行为的来源。

首先,您使用未初始化的变量 count .所以需要初始化为0 : count = 0 .您的编译器可能在编译期间警告过您 - 不要忽略警告!大多数情况下,它们包含有关代码中逻辑错误的宝贵信息。

其次,您为 float* 添加了别名用int* .这违反了 strict aliasing规则。虽然您的代码可能 工作,但它不是保证,因此您的程序可能随时崩溃并且可能 kill your cat even if you don't have one .

总的来说,除了解决问题之外,还有很多方法可以改进您的代码。例如,您可以替换您的 binary.compare使用更易于管理的内容,例如 if (binary[binary.size() - i] == '0')或使用 std::count_if而不是整个 for循环等等等等

编辑:

此外,这不是 C,您不需要在函数的开头声明所有变量(此外,这被认为是不好的做法,因为它会导致使用未初始化的变量,例如您遇到的变量)。在第一次使用时声明它们并始终初始化它们,例如int mantlen = 23 ,甚至更好 constexpr int mantlen = 23 , 所以你可以说 bitset<mantlen>实现 DRY 原则。

关于c++ - 有人可以解释为什么我的程序收到 std::length_error 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33226029/

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