VS c++和MinGW实现双重类型有什么区别
what difference between VS c++ and MinGW to implement double type
在VS c++和MinGW中运行的相同代码得到了不同的结果。结果是类型为double。示例:在VS中,c++得到"-6.397745731873350",而在MinGW中得到"-6.99774573183378"。但我不知道为什么?
我大胆猜测这是两种可能性之一。
当Windows NT是新的,并且它们支持移植到其他处理器(例如MIPS和DEC Alpha)时,MS有一点问题:处理器都有64位浮点类型,但它们有时会产生稍微不同的结果。DEC Alpha在64位双精度上进行计算,为64位双。x86上的默认模式有点不同:当您加载浮点数字时,任何较小的类型都会转换为其内部的80位扩展双格式。然后所有的计算都以80位的精度完成。最后,当您存储该值时,它被四舍五入为64位。这意味着两件事:首先,对于单精度和双精度结果,英特尔的速度要慢得多。其次,处理器之间的双精度结果往往略有不同。
为了解决这些"问题",微软建立了标准库,将浮点处理器调整为仅使用64位精度,而不是80位精度。尽管他们早就放弃了对其他处理器的所有支持,但他们仍然(至少上次我看的时候,如果它改变了,我会很惊讶)将浮点处理器设置为只能以64位精度工作。我还没有检查以确定,但我猜MingW可能会将浮点处理器设置为默认的80位精度。
还有另一个可能的差异来源:如果你将32位编译器与64位编译器进行比较,你会得到不同的(尽管仍然有点相似)情况。32位编译器(Microsoft和gcc)使用x87风格的浮动寄存器和指令。不过,微软的64位编译器不使用x87风格的浮点(至少在默认情况下)。相反,它使用SSE指令。我也没有对此做过很多测试,但如果x87和SSE在保护位和舍入等方面有细微差异,我一点也不会感到惊讶。我预计不会有太大的差异,但会认为一些微小的差异极有可能(近乎不可避免)。
计算机无法准确表示大多数浮点数。它们是近似值。他们的表述存在一定程度的不可靠性。不同的编译器可能会以不同的方式实现不可靠性。这就是你看到这些差异的原因。
阅读这篇优秀的文章:
- 每个计算机科学家都应该知道浮点运算
不同之处在于精度,其中MinGW和VS C++可以表示您的浮点数。。
什么是精度
浮点数的精度是它在不丢失任何信息的情况下可以表示多少位数
考虑分数1/3
。这个数字的十进制表示是0.33333333333333…
,3的值一直到无穷大。无限长的数字需要无限内存才能精确地描述,但float
或double
数据类型通常只有4
或8
字节。因此浮点&双位数只能存储一定数量的数字,其余的肯定会丢失。因此,没有确切准确的方法来用需要比变量更高精度的数字来表示浮点数或双数。
- 我应该使用什么来代替void作为变体中的替代类型之一
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 您应该在什么时候创建自己的异常类型
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 未命名的非类型模板参数有什么意义?
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 模板<>模板<类型名 T> 语法有什么用?
- 指针类型类成员的动态强制转换的恒定性是什么?
- 当 c++ 需要一种数据类型并获取另一种数据类型时会发生什么?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 返回类型在 C++ OOP 中是什么意思
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- 删除对象(具有不同类型)的引用时会发生什么情况?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 当你只使用 return 时,函数返回什么类型;在 c++ 中