- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
因此,我为作业编写了一个程序,内容是使用 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/
在我的应用程序中,我还使用了 C++/Boost 库。奇怪的是,所有崩溃日志都与 std::length_error() 有关。 谁能提供一些线索吗?欢迎任何评论。 124 Thread 8 Cras
我的程序由三个文件组成。 arithcard.hpp(头文件)、assign2.cpp(主程序)和arithcard.cpp(方法)。 在数组 cards 中,存储从文本文件读取的字符串。例如,car
这是我得到的错误: terminate called after throwing an instance of 'std::length_error' what(): basic_string::_
我不确定为什么会收到“std::length_error”。下面是我的代码: #include "受害者.hpp" #include "Room.hpp" #include "Item.hpp" #i
我正在尝试用 C++ 编写一个简单的 Hangman 游戏。游戏大部分工作,但有时当我调试它时,我得到异常 std::length_error。通常在用户输入选择后。由于 Stack Overflow
stringstream str(line, ios_base::in); while(!str.eof()){ string word; str >> word; std::
这是我在这里的第一篇文章。由于我是新手,这个问题可能很愚蠢。当显示以下错误消息时,我正在编写一段代码, 在抛出“std::length_error”的实例后调用终止 什么(): basic_strin
因此,我为作业编写了一个程序,内容是使用 IEEE 格式将 float 转换为科学基数 2。当我用程序在我的计算机上运行它时,教授让我们运行的测试通过了,但是当我收到作业时,他说程序在所有测试中都遇到
我收到以下异常。不确定是什么原因造成的。 有什么想法吗? 这是我的连接字符串: std::string brokerURI = "tcp://127.0.0.1:61613?wireFormat=st
这是我的方法之一,哈希有效且已正确分配,但在它退出功能之前,“blockHash”变为“”,这给了我上面的错误。 Block::Block(int index, const double amount
我正在使用 Boost Regex。我有以下代码(简化): bool search_for_match(const string& data) { boost::smatch results;
我用 SFML 开始了一个项目,我想在窗口标题上显示 fps 和勾号,但这不起作用: string title = to_string(frames) + " fps, " + to_string(
当我运行我的程序时,它因以下错误而崩溃: terminate called after throwing an instance of 'std::length_error' what(): basi
我正在 Tutorials Point 上使用 pthread 在 C++ 中学习多线程(它可能很旧,但我只需要一些东西来开始)。我稍微修改了代码: #include #include #incl
当编译器处于发布版本时,我收到标题中提到的运行时错误,而当它处于调试版本时,出现段错误。我做了一些研究,我发现这是因为我将字符串传递给 add 方法的方式。我不清楚,所以如果有人用简单的语言描述为什么
这是我的第一个 c++ 项目,因此可能会有初学者失败。还是要学很多东西。 我正在通过将连接的圆柱体与点云库相匹配来为树木(真正的户外树木)建模。在我的真实场景中,我检测到大约 3000 个圆柱体,我想
我正在尝试使用 Boost.Filesystem 库遍历目录。 问题是当我尝试实例化一个路径对象时,我得到一个 std::length_error 消息“string too long”和任何长度的字
在运行我的程序时出现此错误: terminate called after throwing an instance of 'std::length_error' what(): basic_s
我正在使用 SFML 对于我的项目,我目前正在关注网站上的教程。 目前我只完成了创建 RenderWindow 的第一步 使用以下代码(直接从教程粘贴): #include #include in
在浏览了之前就此主题提出的问题后,我并没有真正理解任何答案。我的助教试图帮助我解决这个问题大约一个小时,但无法解决任何问题。 首先,这是程序编译时出错的地方 在 xthrow.cpp 中 _CRTIM
我是一名优秀的程序员,十分优秀!