【问题标题】:Visual C++ double vs C++ doubleVisual C++ 双倍与 C++ 双倍
【发布时间】:2014-02-28 10:27:55
【问题描述】:

我已经将一些代码从 C++ 移植到 Visual C++(这是我第一次在 Visual C++ 环境中编写代码)。代码做了很多数学运算,我可以看到原始代码和移植代码有不同的结果。

几乎我所有的变量都是双精度数据类型。

也许这是一个愚蠢的问题,但是 Visual C++ double 和 C++ double 之间有什么区别吗?有范围差异吗?我似乎找不到任何解释其数据类型的 Visual C++ 文档。

【问题讨论】:

  • 您使用的是什么版本的 Visual Studio?最初为哪个编译器编写代码?
  • C++ double 应该是什么?
  • 另外,您是否看到优化构建的差异?编译器选项会影响浮点数学。
  • 它们是完全错误的不同还是与verrrry不同的值略有不同
  • “我已经将一些代码从 C++ 移植到 Visual C++” 这并不意味着什么。 C++ 是一种编程语言,Visual C++ 是使用该语言进行编程的环境。

标签: c++ visual-c++ types double


【解决方案1】:

乍一看没有区别,但不同的编译器可能优化表达式的方式不同。

项目属性中的代码生成选项具有浮点模型设置。它可以是精确的、严格的或快速的。

【讨论】:

  • 感谢您的回答!它设置为精确。当我将其更改为 Strict 时,我收到以下错误:D8016: '/clr' 和 '/fp:strict' 命令行选项不兼容。
【解决方案2】:

看看这个:http://www.altdevblogaday.com/2012/03/22/intermediate-floating-point-precision/

VS 有一个 /fp 选项 (http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx) 来指定浮点精度(类似于 CUDA 的 fastmath)。其中一些也可以防止内在函数;如果你有转化,那可能会有很大的不同..

最后,这些设置的行为和默认值取决于编译器 (http://social.msdn.microsoft.com/Forums/vstudio/en-US/ebab293c-0c85-462e-a352-22ff8ee55c36/sqrt-code-optimization-is-twice-faster-on-vs20082010-than-vs2012-sse?forum=vcgeneral)

【讨论】:

  • 感谢链接,它解释了一些事情。我会使用一些建议,看看是否有帮助。
【解决方案3】:

Visual C++ 使用 IEEE 754 格式存储双精度数。 “C++ double”没有具体定义,但如果您能发现它没有使用 IEEE 754,因为它是大多数 CPU 的本机编码,我会感到惊讶。

所以不,没有区别!

【讨论】:

  • 应该没有区别:)
【解决方案4】:

据我了解,在 32 位模式下,Visual Studio 使用 x87,而在 64 位模式下,它至少使用 SSE2。 Visual Studio 的默认设置是在 64 位操作系统上以 32 位模式编译,而在 GCC 上编译的默认设置是在 64 位操作系统上使用 64 位模式。所以也许这只是 32 位或 64 位模式的问题。尝试在 Visual Studio 中以 64 位模式编译代码。从 MSVC 2010 开始,您甚至可以在 Express 版本中执行此操作。

x87 和 SSE 是不同的硬件。 x87 使用 80 位进行内部计算(但只存储 64 位),而 SSE 只有 64 位。维基百科很好地解释了为什么为 x87 选择 80 位 http://en.wikipedia.org/wiki/Extended_precision#Need_for_the_80-bit_format

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2014-03-02
    • 2019-11-08
    • 1970-01-01
    • 2013-03-30
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多