Performance 长双精度的性能影响。为什么C选择64位而不是硬件';默认值为80位?

Performance 长双精度的性能影响。为什么C选择64位而不是硬件';默认值为80位?,performance,visual-c++,x86,floating-point,long-double,Performance,Visual C++,X86,Floating Point,Long Double,关于具体内容,我将介绍x87 PC体系结构和C编译器 我正在编写自己的解释器,double数据类型背后的推理让我感到困惑。特别是在效率方面。有人能解释为什么C决定使用64位double而不是硬件原生的80位double?既然80位双精度,那么为什么硬件会选择80位,因为它没有对齐?每种方法对性能的影响是什么我想使用80位双精度作为我的默认数字类型。但是编译器开发人员的选择让我担心这不是最佳选择 x86上的double只短2个字节,为什么编译器默认不使用10字节长double 我能举一个80位长双

关于具体内容,我将介绍x87 PC体系结构和C编译器

我正在编写自己的解释器,
double
数据类型背后的推理让我感到困惑。特别是在效率方面。有人能解释为什么C决定使用64位
double
而不是硬件原生的80位
double
?既然80位
双精度
,那么为什么硬件会选择80位
,因为它没有对齐?每种方法对性能的影响是什么我想使用80位
双精度
作为我的默认数字类型。但是编译器开发人员的选择让我担心这不是最佳选择

  • x86上的
    double
    只短2个字节,为什么编译器默认不使用10字节
    长double
  • 我能举一个80位
    长双精度
    双精度
    的例子吗
  • 为什么Microsoft在默认情况下禁用长双精度
  • 就量级而言,在典型的x86/x64 PC硬件上,
    long double
    的性能差/慢多少

  • 根据Mysticial的说法,答案是微软将SSE2用于其
    double
    数据类型。与现代CPU扩展相比,浮点单元(FPU)x87被视为过时且速度缓慢。SSE2不支持80位,因此编译器选择64位精度

    在32位x86体系结构上,由于所有CPU还没有SSE2,Microsoft仍然使用浮点单元(FPU)x87,除非给出编译器开关
    /arch:SSE2
    。这使得代码与旧代码不兼容?CPU。

    错误的问题。 它与C无关,所有语言都使用AFAIK作为标准浮点单精度32位和双精度64位。C作为一种支持不同语言的语言 硬件仅定义


    sizeof(float)这实际上是一个太多的问题,其中有些问题甚至过于宽泛

    有人能解释为什么C决定使用64位双精度而不是硬件原生80位双精度吗

    这与C无关,因为C标准只规定了内置类型的最低要求,并且完全由编译器实现来选择他们想要用于类型的任何格式。没有什么可以阻止C编译器使用一些定制的77位浮点类型


    既然没有对齐,为什么硬件会选择80位双精度?每种方法对性能的影响是什么

    它与2个字节的倍数对齐。请记住,x87可以追溯到8086+8087

    对于现代硬件实现者和软件编写者来说,这是一个很好的折衷方案,他们需要在
    双精度
    操作中获得更高的精度。太大的类型,你会需要更多的晶体管。将有效位中的位数增加一倍,则乘法器需要是有效位的4倍

    x87算术和初始IEEE 754标准提案的主要设计者William Kahan对x87浮点运算的开发进行了说明:“包括了一种扩展格式(80位),它与惠普10位十进制计算器中的13位十进制内部格式具有相同的支持作用。”,Kahan指出,64位是最宽的有效位,在不增加8087上的循环时间的情况下,可以在其上进行进位传播,并且x87扩展精度设计用于在未来的处理器中扩展到更高的精度:“目前,10字节的扩展格式在超精确算法的价值和实现快速运算的代价之间是一个可以容忍的折衷方案;很快,再增加两个字节的精度就可以接受了,最终将是16字节的格式。。。当IEEE 754浮点运算标准制定时,这种逐渐向更高精度发展的趋势已经出现

    如您所见,使用64位有效位,您可以与整数ALU共享组件(加法器、乘法器…)


    我想使用80位双精度作为我的默认数字类型。但是编译器开发人员的选择让我担心这不是最好的选择。x86上的double只短2字节,为什么编译器默认不使用10字节长的double

    它实际上是用来作为一个临时变量(如
    tmp=(b*c+d)/e
    )来避免内部溢出或下溢问题,而无需特殊技术,如。它不是默认的浮点类型。事实上,当使用
    longdouble
    float
    时,很多人都不正确地使用浮点文本。他们忘记添加正确的后缀,这导致精度不高,然后他们问为什么
    longdouble
    double
    完全相同。总之,
    double
    几乎适用于所有情况,除非您受到带宽或精度的限制,并且您确实知道自己在做什么


    我能举一个80位长的双精度vs双精度的例子吗

    您可以打印完整的值并自己查看。还有很多问题值得一读


    为什么微软默认禁用长双精度

    Microsoft默认情况下不禁用长双精度。他们只是选择将
    长双精度
    映射到IEEE-754双精度,顺便说一句,其格式与
    双精度
    相同。类型
    long double
    仍可正常使用。他们这样做是因为苏格兰和南方能源公司的数学运算更快、更一致。这样你就可以避免像下面这样的“bug”

    除了64