【问题标题】:How to save and restore exact floating point values to a human readable file in C++如何在 C++ 中将精确的浮点值保存和恢复到人类可读的文件中
【发布时间】:2013-08-12 23:45:25
【问题描述】:

我需要能够从我的 C++ 程序中将精确的浮点值保存和恢复到人类可读的(文本)文件中。我可以将 %A 格式与 srinf 一起使用来保存确切的值,但我无法找到恢复它的方法。将 %A 格式与 sscanf 一起使用对我不起作用。

我的示例程序如下。它成功地将 0X1.921FB4D12D84AP+1 打印为 num1 的值,但是当我重新输入该值时,它将 num2 设置为 0。我正在使用 GCC 4.7.3 的 Cygwin 环境(DLL 版本 1.7.22)中运行, G++编译选项包括:-std=gnu++11 -Wall -Wextra

#include <cstdio>
#include <string>
#include <iostream>

int main () {

    double num1 = 3.1415926;
    double num2;
    std::string input;
    int result;

    printf("%lA\n", num1);

    std::cout << std::endl;
    std::cout << "Input:" << std::endl;
    std::cin >> input;
    std::cout << "Got: " << input << std::endl;

    num2 = 0.0;
    result = sscanf(input.c_str(), "%lA", &num2);
    std::cout << "num2 is " << num2 << " and result is " << result << std::endl;

    return 0;
}

【问题讨论】:

  • 你试过“%a”(小写,没有l)吗? (哎呀:保持 l)
  • 是的,%la 或 %lA 都不起作用。是的,l 是必需的,因为 num2 是双精度数。

标签: c++ floating-point


【解决方案1】:

我建议您改用 atof() 函数,或使用 boost::lexical_cast。如果您的号码中有一个字符串,两者都将完成您想要做的事情。

【讨论】:

  • 我不认为向 C++ 编程新手推荐 Boost 是个好主意
  • 调查、研究和使用新工具来解决问题——这些是在 C++ 中变得更好的要素。他应该仔细研究它,因为他是一个新程序员。我故意省略了示例代码,以便他可以研究并了解更多信息。
  • 我同意这一点,但我认为 Boost 太复杂,无法被新的 C++ 程序员使用/学习。在使用 Boost 之前需要学习很多东西。
  • 我并不是一个新程序员,我只是从 90 年代初就没有使用过 C/C++(使用旧的 NIH 类库)。我不反对使用 Boost,但如果可以的话,我更愿意坚持使用标准库,并且 atof() 的表亲 strtod() 是我需要的,因为它会检查 atof() 没有的一些错误不会。(我完全忽略了 GNU C 库文档link 中关于解析数字的部分)。
猜你喜欢
  • 2012-08-08
  • 2021-04-27
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多