- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
下面,result1 和 result2 变量值报告不同的值,具体取决于是否在 GCC 4.2.1 和 GCC 3.2.0 上使用 -g 或 -O 编译代码(我还没有尝试更新的 GCC 版本):
double double_identity(double in_double)
{
return in_double;
}
...
double result1 = ceil(log(32.0) / log(2.0));
std::cout << __FILE__ << ":" << __LINE__ << ":" << "result1==" << result1 << std::endl;
double result2 = ceil(double_identity(log(32.0) / log(2.0)));
std::cout << __FILE__ << ":" << __LINE__ << ":" << "result2==" << result2 << std::endl;
result1 和 result2 == 5 仅当使用 -g 编译时,但如果我使用 -O 编译,我得到 result1 == 6 和 result2 == 5。
这似乎与编译器进行优化的方式不同,或者与内部 IEEE 浮点表示有关,但我很好奇这种差异究竟是如何发生的。我希望尽可能避免查看汇编器。
上面是用 C++ 编译的,但我认为如果使用 printfs 将其转换为 ANSI-C 代码,同样会成立。
上述差异出现在 32 位 Linux 上,但不会出现在 64 位 Linux 上。
谢谢背景
最佳答案
在 x86 上,通过优化,子表达式的结果在用作更大表达式的一部分之前不一定存储到 64 位内存位置。
因为 x86 的标准浮点寄存器是 80 位,这意味着在这种情况下,额外的精度是可用的。如果您随后将这个特别精确的值除以(或乘以)另一个值,则精度提高的效果会放大到肉眼可以察觉的程度。
Intel 的 64 位处理器使用 SSE 寄存器进行浮点运算,而这些寄存器没有额外的精度。
你可以玩弄 g++ flags如果您真的很在意,可以解决这个问题。
关于c++ - 将 double 类型传递给 ceil 会导致 GCC 中不同优化级别的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3323900/
我尝试运行以下代码,该代码位于 Bash 脚本内。 NUMBER=600 LOSS_RATE=0,3 TOT_PKT=100 test=$(python -c "from math import ce
为了使其更通用......我通过这样做更改了 Javascript 中 Number 对象的原型(prototype) Number.prototype.ceil = function() { ret
我需要委托(delegate)“ceil”函数。我的类有方法'ceil',它需要返回cpp 的本地方法'ceil'。怎么调用它? double ceil() { return ceil(); } -这
我运行了一个程序来找出 n + 1 和 2**ceil(log2(n+1)) 之间的区别,其中 n 是 2 的幂。一直呈指数增长 所以根据 Big - O 的定义,不存在满足 - 的常量 c' 2^(
这个问题在这里已经有了答案: Why does the order of '-l' option in gcc matter? [duplicate] (3 个答案) 关闭 3 年前。 我正在尝试在
这个问题在这里已经有了答案: Is floating point math broken? (31 个答案) PHP - Floating Number Precision [duplicate]
所以我刚从一个我做得很好的学校项目中拿回了我的成绩,但是因为我没有调用 ceil(...),评分者扣了 5 分。这是一门使用 CUDA 的并行计算类(class),但问题与任何 CUDA 功能没有直接
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我目前有这样的功能,可以将任何输入数字四舍五入到最接近的模糊整数值: $(function(){ $('#my_value').blur(function() { $(this).va
#include using namespace std; int main() { long long n,m; double ans; cin>>n>>m; an
为什么输出0而不是1? System.out.println((int) (Math.ceil(1/2))); 虽然这个正确输出 1 System.out.println((int) (Math.ce
#include #include int main() { long X; std::cin >> X; long f = ceil(X); std::cout > X 行在 ceil 看到值之前截
我对 matlab 中的 ceil 函数有疑问。当我说“ceil(192.00)”时,它应该返回 192。但是,当我声明一个变量 x 并将其赋值为 14*(256/20)+(256/20) 时,正好是
谁能解释一下? echo ceil( 20.7 * 100 ); // returns 2070 echo ceil( 2070 ); // returns 2070 一切正常,合乎逻辑,
在 VC++ 2008 中,ceil(-0.5) 返回 -0.0。这是通常/预期的行为吗?避免将 -0.0 打印到 i/o 流的最佳做法是什么。 最佳答案 C++中的 ceil来自C标准库。 C 标准
今天早上我丢失了一堆文件,但因为它们是一个卷,在内部和外部都进行了碎片整理,所以 100% 恢复所需的所有信息都可用;我只需要在需要的地方填写 FAT。 我编写了一个程序来执行此操作,并在我转储到文件
当四舍五入到 2 个小数位时,值 4.01132141 将四舍五入为 4.02,因为它超过了 4.01。 你怎么能在 PL/SQL 中做到这一点? 最佳答案 一种方法是做 ceil(value*100
我创建了一个函数来返回两个日期之间的差异 dateDiff($v[17], date('Y/m/d')); if ($days dateDiff('10 oct 2011',date('Y/m/d')
通常我会询问工作方面的问题,所以这里有一些不同的内容。为了以尽可能最 Nerd 的方式实现我的新年决心,我正在 Excel 文件中创建一个健身计划。我会做斜坡组,这意味着每组我都会增加 10% 的重量
是否可以对时间格式变量(例如 09:31:23)使用命令 ceil?我想使用 ceil 来获得 09:32:00。我尝试使用类似于 round(time,'0:01:00'T) 的东西,但我想使用 c
我是一名优秀的程序员,十分优秀!