gpt4 book ai didi

c++ - C/C++ 中浮点常量的紧凑无损表示

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:26 24 4
gpt4 key购买 nike

我有一个用 C++ 编写的程序,它正在生成用于数学计算的 C 源代码。我注意到常量在生成的代码中占用了很多空间,正在寻找更紧凑的表示形式。

为了生成常量,我现在使用:

double v = ...
cfile << std::scientific << std::setprecision(std::numeric_limits<double>::digits10 + 1) << v;

我很确定这是一种无损表示,但它也非常臃肿。例如,零和一将表示为 0.0000000000000000e+00 和 1.0000000000000000e+00。和“0”。或“1”。携带同样多的信息。

有没有办法以更紧凑但仍然无损的方式将常量打印到文件中?它不需要对人类读者来说看起来很好,只要在纯 C 代码中出现就可以编译(如果是 C99,我更愿意它也是有效的 C++)。如果它是可移植的,十六进制可能没问题。

编辑:删除了代码片段中的 std::fixed

最佳答案

您可以使用十六进制 float ( The format specifier %a for printf() in C );它被定义为保留所有精度位(C11、7.21.6.1p8、a,A 说明符)。

cfile << std::hexfloat << v;

如果您的编译器/标准库不支持 hexfloat,您可以使用 C99 %a printf 说明符(这是等效的,如 C++11 表中指定88 在第 22.4.2.2.2 节下):

printf("%a", v);

例如,以下程序是有效的 C99:

#include <stdio.h>
int main() {
double v = 0x1.8p+1;
printf("%a\n", v);
}

您生成的源文件将不是有效的 C++11,因为相当荒谬的 C++11 不支持十六进制浮点文字。然而,许多 C++11 编译器支持 C99 十六进制浮点文字作为扩展。

关于c++ - C/C++ 中浮点常量的紧凑无损表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15156266/

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