视觉比较C 与C 构建器中的浮点数
visual Comparing floating point numbers in VS C++ vs C++ Builder
我正在使用最初在Visual C 中编译的天文学代码。我正在32位VCL平台上的C 构建器XE4中编译它。
在此代码中,对于非常小的数字进行了很多比较,所有比较都定义为double
。下面的代码剪辑显示了VC 代码中的一些示例比较。我需要在VC 和C 构建器中相同的结果,因此我对比较浮点数数字有一些疑问:
-
C 构建器是否比较浮点数与VC 相同?
-
在C 构建器中,我是否需要使用
CompareValue(double, double)
函数重写代码? -
如果我从
#include <cmath>
切换到使用#include <math.h>
和#include <math.hpp>
?
,我会得到相同的结果
在两个编译器中获得相同结果的任何建议都会有所帮助。
#include "stdafx.h"
#include <cmath>
#include <cassert>
using namespace std;
...
else if ((fgamma > 0.9972) && (fgamma < (1.5433 + details.u)))
{
if ((fgamma > 0.9972) && (fgamma < (0.9972 + fabs(details.u))))
{
if (details.u < 0)
...
简短答案
-
否
-
取决于两个 线程环境中的编译器设置。
-
是的,但请参见#2
长答案
编译器设置
最重要的编译器设置是目标指令集。根据设置的不同,双精度浮点代码可以编译到传统X87指令中,或更高(SSE 4,AVX等)有趣的是,一些具有一些设置的编译器将两者都编译为两者。在同一程序中,他们可以将X87用于一件事,而SSE则用于其他方面。
还有其他相关的编译器开关,例如/fp
在Visual C
线程环境
对于x87代码,线程状态的有趣部分是x87 FPU控制寄存器。有关Visual C ,请参见_controlfp_s api。
CPU的SSE组件使用类似的东西,MXCSR寄存器。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 在数学上将浮点数四舍五入到 N 位小数
- Cython通过浮点数的最快方式,用于高频控制回路
- 视觉比较C 与C 构建器中的浮点数