繁体   English   中英

VS c ++和MinGW之间有什么区别来实现double类型

[英]what difference between VS c++ and MinGW to implement double type

在VS c ++和MinGW中运行相同的代码得到了不同的结果。 结果是double的类型。 示例:在VS c ++中得到“-6.397745731873350”,但在MinGW中得到“-6.397745731873378”。 垃圾不同。 但我不知道为什么?

我猜测这是两种可能性之一。

当Windows NT是新的,并且它们支持移植到其他处理器(例如,MIPS和DEC Alpha)时,MS有一点问题:处理器都有64位浮点类型,但它们有时会产生稍微不同的结果。 在DEC的Alpha做了计算上的64位双精度 64位双。 x86上的默认模式略有不同:当您加载浮点数时,任何较小的类型都会转换为其内部80位扩展双精度格式。 然后所有计算都以80位精度完成。 最后,当您存储该值时,它会回滚到64位。 这意味着两件事:首先,对于单精度和双精度结果,英特尔的速度要慢一些。 其次,双精度结果通常在处理器之间略有不同。

为解决这些“问题”,Microsoft设置了标准库,将浮点处理器调整为仅使用64位精度而不是80位。 虽然他们很久以来都放弃了对其他处理器的所有支持,但他们仍然(至少在我看的最后一次,如果它发生变化我会感到惊讶)将浮点处理器设置为仅以64位精度工作。 我没有检查确定,但我猜测MingW可能会将浮点处理器设置为默认的80位精度。

还有另一个可能的差异来源:如果您将32位编译器与64位编译器进行比较,则会得到不同的(尽管仍然有些类似)情况。 32位编译器(包括Microsoft和gcc)使用x87样式的浮动寄存器和指令。 Microsoft的64位编译器不使用x87样式的浮点(至少在默认情况下)。 相反,它使用SSE指令。 我也没有做过很多测试,但是如果(再次)x87和SSE在保护位和舍入等方面存在细微差别,我也不会感到惊讶。 我不会指望存在很大的差异,但会极有可能考虑一些细微的差异(接近不可避免)。

计算机无法准确表示大多数浮点数。 它们是近似的。 他们的代表性存​​在一定程度的不可靠性 不同的编译器可能以不同方式实现不可靠性 这就是你看到这些差异的原因。

阅读这篇优秀的文章:

不同之处在于MinGW和VS C ++可以表示浮点数的精度

什么是精度?

浮点数的精度是它可以表示的位数,而不会丢失它包含的任何信息。

考虑1/3的分数。 这个数字的十进制表示是0.33333333333333…其中3表示无穷大。 无限长度数将要求以精确精度描绘无限存储器,但floatdouble数据类型通常仅具有48个字节。 因此,浮点数和双数字只能存储一定数量的数字,其余数字必然会丢失。 因此,没有明确准确的方法来表示浮点数或双数字,其数字需要比变量可以容纳更多的精度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM