双精度-MS visual C++;2005 Vs Matlab 我使用MS Visual C++ 2005实现C++中的一些数学算法。我的C++代码采用10K双数据类型输入值,其精度为12位小数(例如866×333333333333),这些值是在MATLAB中生成的。然后,我的代码进行了一些计算,并给出了一个结果,即当在相同的输入值下运行相同的算法时,机械实体的损伤值应该与matlab输出相同 我的问题是,Matlab给出了10K输入值,精度为12位小数,但是我的C++代码使它们达到15位小数。这意味着866.333333333333的MATLAB将被用作866.33333333333303的C++。我知道这就是IEEE754的浮点表示法。 但是,当我比较C++输出和Matlab输出时,输入的这个微小的变化确实会导致最终结果的可测量的差异。我可能听起来很奇怪,但这就是梅的观察。我希望我能在这里分享一些代码,但这是非常机密的。如果有人能帮我度过难关,我将不胜感激

双精度-MS visual C++;2005 Vs Matlab 我使用MS Visual C++ 2005实现C++中的一些数学算法。我的C++代码采用10K双数据类型输入值,其精度为12位小数(例如866×333333333333),这些值是在MATLAB中生成的。然后,我的代码进行了一些计算,并给出了一个结果,即当在相同的输入值下运行相同的算法时,机械实体的损伤值应该与matlab输出相同 我的问题是,Matlab给出了10K输入值,精度为12位小数,但是我的C++代码使它们达到15位小数。这意味着866.333333333333的MATLAB将被用作866.33333333333303的C++。我知道这就是IEEE754的浮点表示法。 但是,当我比较C++输出和Matlab输出时,输入的这个微小的变化确实会导致最终结果的可测量的差异。我可能听起来很奇怪,但这就是梅的观察。我希望我能在这里分享一些代码,但这是非常机密的。如果有人能帮我度过难关,我将不胜感激,matlab,visual-studio-2005,double,floating-accuracy,double-precision,Matlab,Visual Studio 2005,Double,Floating Accuracy,Double Precision,提前谢谢 浮点数据类型不是由小数位数定义的,而是由用于表示数字的位数以及用于解释这些位数的规则(即IEEE754标准)定义的 一般来说,在两个不同的“环境”(即平台/CPU/编译器等)中实现相同的输出(给定相同的输入)不是一项简单的任务。作为一个松散的例子,考虑编译器可能有一些自由度来计算诸如“代码> A+B+C < /代码>之类的表达式,如(A+B)+C < /COD>或 A+(B+C)< /代码>,这在浮点计算中可能会给出不同的结果。我强烈建议你重新考虑——得到完全相同的结果真的很重要吗 不

提前谢谢

  • 浮点数据类型不是由小数位数定义的,而是由用于表示数字的位数以及用于解释这些位数的规则(即IEEE754标准)定义的
  • 一般来说,在两个不同的“环境”(即平台/CPU/编译器等)中实现相同的输出(给定相同的输入)不是一项简单的任务。作为一个松散的例子,考虑编译器可能有一些自由度来计算诸如“代码> A+B+C < /代码>之类的表达式,如<代码>(A+B)+C < /COD>或<代码> A+(B+C)< /代码>,这在浮点计算中可能会给出不同的结果。我强烈建议你重新考虑——得到完全相同的结果真的很重要吗
  • 不管2中写了什么,在你的情况下,它可能是可能的。作为第一步,您应该使用数据的二进制表示,而不是文本表示。换句话说,保存代表数据的字节,并将其传递给C++代码。例如,不是传递
    1.0
    ,而是传递
    0x3FF0000000000000
    (尽管
    1.0
    是完全可二进制表示的,这只是一个示例)
  • 当然,一些代码会有所帮助。试着建立一个玩具的例子,显示你的问题,而不透露任何机密信息

  • 浮点数据类型不是由小数位数定义的,而是由用于表示数字的位数以及用于解释这些位数的规则(即IEEE754标准)定义的
  • 一般来说,在两个不同的“环境”(即平台/CPU/编译器等)中实现相同的输出(给定相同的输入)不是一项简单的任务。作为一个松散的例子,考虑编译器可能有一些自由度来计算诸如“代码> A+B+C < /代码>之类的表达式,如<代码>(A+B)+C < /COD>或<代码> A+(B+C)< /代码>,这在浮点计算中可能会给出不同的结果。我强烈建议你重新考虑——得到完全相同的结果真的很重要吗
  • 不管2中写了什么,在你的情况下,它可能是可能的。作为第一步,您应该使用数据的二进制表示,而不是文本表示。换句话说,保存代表数据的字节,并将其传递给C++代码。例如,不是传递
    1.0
    ,而是传递
    0x3FF0000000000000
    (尽管
    1.0
    是完全可二进制表示的,这只是一个示例)

  • 当然,一些代码会有所帮助。试着建立一个玩具示例,在不泄露任何机密信息的情况下展示您的问题。

    如果这个问题(以及任何答案)是以有效数字而不是小数位数为框架的,则会更准确。正如Itamar Katz所暗示的那样,IEEE标准将双精度浮点数存储为52位的有效位(有人称之为尾数)。该标准还包含一个额外的位,因此double有53个有效位。当二进制数转换为十进制表示时,将转换为15或16位有效数字

    < Matlab和Visual C++都可以(没有附加的设施,如任意精度库或使用128位F-P数)存储双倍以上的标准大小。如果您的程序以任何一种语言向您显示的数字超过15(或16)位小数,则您不能信任任何多余的数字。它们不是来自数字的存储表示,而是在内存和屏幕之间的某一行添加的——也许一个“有用的”数字格式化程序只是将最右边的数字扩展,直到您看到所请求的19位数字(或其他数字)

    <> P>从如何从C++传递到/从MATLAB传递数字,或者甚至是传输数字,这一点还不完全清楚;也许你只是想写一个C++程序,它可以复制MATLAB程序的结果。(我们在这里经常这样做,所以我在这个领域有一些经验。)

    如果使用“文本”文件,则传输的不是数字,而是数字的表示形式。如果您的程序将文本“15.833”读入双变量,则对有效位中的额外数字所取的值进行任何假设都是不安全的。特别是,你不应该假设它们被设置为0——嗯,我想有人更了解C++可能会告诉我们语言标准确实保证了这一点,但是Matlab不这样做,我也不认为C++也能保证。如果要设置额外的数字,请在文本表示中指定它们。即使这样也不能保证您存储的值与文本文件中指定的值完全一致,您的变量(可能)将保存与文本中的值最接近的f-p数

    但是,如果您的文本文件是由Matlab(或C++)编写的,并将15或16位数字写入textu