Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sin(<;负零>;)不会在Visual Studio 2013 64位上返回预期结果_C++_Visual C++_Visual Studio 2013_Ieee 754 - Fatal编程技术网

C++ sin(<;负零>;)不会在Visual Studio 2013 64位上返回预期结果

C++ sin(<;负零>;)不会在Visual Studio 2013 64位上返回预期结果,c++,visual-c++,visual-studio-2013,ieee-754,C++,Visual C++,Visual Studio 2013,Ieee 754,在我为之开发的工程应用程序中,我偶然发现32位和64位之间sin(-0)的结果存在差异。由于计算的性质,这会传播到一些相位差中 我们正在使用MSVC 2013在Windows上开发 显然,浮点标准指定sin(-0)返回未更改的参数-至少根据 我做了一些调查,这些是我得到的一些其他结果: // Visual Studio 2013 32 bit on Win7 - default arguments std::sin( -0 ) = -0 std::sin( 0 ) = 0 // Visual

在我为之开发的工程应用程序中,我偶然发现32位和64位之间sin(-0)的结果存在差异。由于计算的性质,这会传播到一些相位差中

我们正在使用MSVC 2013在Windows上开发

显然,浮点标准指定sin(-0)返回未更改的参数-至少根据

我做了一些调查,这些是我得到的一些其他结果:

// Visual Studio 2013 32 bit on Win7 - default arguments
std::sin( -0 ) = -0
std::sin( 0 ) = 0

// Visual Studio 2013 64 bit on Win7 - default arguments
std::sin( -0 ) = 0 // the faulty one
std::sin( 0 ) = 0

// g++ (GCC) 5.1.0 : g++ -std=c++11 -O2 -Wall -pedantic -mfpmath=387 -m64 main.cpp && ./a.out
std::sin( -0 ) = -0
std::sin( 0 ) = 0

// g++ (GCC) 5.1.0 : g++ -std=c++11 -O2 -Wall -pedantic -mfpmath=sse -m64 main.cpp && ./a.out
std::sin( -0 ) = -0
std::sin( 0 ) = 0
我还知道英特尔数学库(libm*.dll)也返回sin(-0)=-0

查看反汇编,std::sin的实现直接进入msvcr120d.dll

问题是:

  • 这是微软64位sin例程实现中的错误吗
  • 我应该使用一些我不知道的特定编译器参数吗
用于上述输出的代码:

#include <cmath>
#include <iostream>

void printSin( const double dfPh )
{
  const auto dfSinPh = std::sin( dfPh );
  std::cout.precision( 16 );
  std::cout << "std::sin( " << dfPh << " ) = " << dfSinPh << std::endl;
}

int main()
{
  printSin( -0.00000000000000000000 );
  printSin( +0.00000000000000000000 );
  return 0;
}
#包括
#包括
无效打印SIN(常数双dfPh)
{
const auto dfSinPh=std::sin(dfPh);
标准:计算精度(16);

STD::CUT

最后我求助于一个穷人的解决方案。我特别用STD::Stand和接近零,并考虑Sin(-0)=-0。


速度慢?也许吧,但符合我们的需要。

我可以使用VS2013 Win8 x64进行测试。但无法在Win7上进行测试。同样可以使用vs2015I确认我在VS2013、更新4、Windows 7上看到同样的问题。Win32和x64配置的不同输出。IIRC、x64默认为SSE,x86构建默认为x87数学。因此这可能不是一个问题32对64位的问题,但x87对SSE。@默认情况下的确如此。不过,我也切换了所有可用的/arch Visual Studio选项,结果在32位(即正确)和64位(即不正确)之间是一致的。因此,要么该选项没有影响,要么错误在MS例程的实现端。