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