c - C 中的长 double

标签 c long-double

我一直在阅读 C Primer Plus预订并得到这个例子

#include <stdio.h>
int main(void)
{
    float aboat = 32000.0;
    double abet = 2.14e9;
    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);
    printf("%f can be written %e\n", abet, abet);
    printf("%f can be written %e\n", dip, dip);

    return 0;
}

在我的 macbook 上运行后,我对输出感到非常震惊:

32000.000000 can be written 3.200000e+04
2140000000.000000 can be written 2.140000e+09
2140000000.000000 can be written 2.140000e+09

所以我环顾四周,发现显示 long double 的正确格式是使用 %Lf。但是,我仍然不明白为什么我得到的是双 abet 值,而不是我在 Cygwin 上运行它时得到的值, UbuntuiDeneb 大概是

-1950228512509697486020297654959439872418023994430148306244153100897726713609
013030397828640261329800797420159101801613476402327600937901161313172717568.0
00000 can be written 2.725000e+02

有什么想法吗?

最佳答案

尝试查看 OSX 上的可变参数调用约定,这可能会解释它。

我猜编译器将第一个 long double 参数传递到堆栈(或 FPU 寄存器),第一个 double 参数传递到 CPU 寄存器(或在堆栈上)。无论哪种方式,它们都在不同的地方传递。因此,当进行第三次调用时,第二次调用的值仍然存在(被调用者拾取它)。但这只是一个猜测。

关于c - C 中的长 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1779061/

相关文章:

c - 在c中打印链表

c - 对整个 4Kb block 使用 mmap() 是否可以,还是一次性对我的整个文件使用 mmap() 更好?

c - 如何在 R 中查看通过 .Call() 调用的 C 代码的调用堆栈

c - 如何在 x86-64 上将 80 位 long double 的尾数作为 int 获取

gcc 9.3.0 printf %Lf 输出不正确

c++ - 从 C/C++ 库中解压缩可执行文件

c++ - 使用 clEnqueueWriteBuffer 的内存损坏 - OpenCL

golang 中的 C long double

c++ - 如果我试图用另一种语言复制一个程序。使用更高的精度是不明智的吗?

python - 混合使用 NumPy longdouble 和 SymPy 数值计算——精度如何?