C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了我可以保证C编译器不会重新排序我的计算吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在阅读优秀的 Library for Double-Double and Quad-Double Arithmetic论文,在前几行中,我注意到它们通过以下方式执行求和:
std::pair<double,double> TwoSum(double a,double b)
{
    double s = a + b;
    double v = s - a;
    double e = (a - (s - v)) + (b - v);
    return std::make_pair(s,E);
}

误差的计算e依赖于以下事实:由于IEEE-754浮点数学的非关联属性,计算遵循该操作顺序.

如果我在现代优化C编译器(例如MSVC或gcC)中编译它,我是否可以确保编译器不会优化计算的方式?

其次,这是否在C标准的任何地方得到保证?

解决方法

是的,这是安全的(至少在这种情况下).你只在那里使用两个“运算符”,主表达式(某物)和二进制某物/某物(添加剂).

第1.9节程序执行(C 0x N3092)状态:

在分组方面,5.1主要表达式指出:

我相信在该引用中使用“相同”一词需要符合要求的实施,以保证它将以指定的顺序执行,除非另一个订单可以给出完全相同的结果.

对于加法和减法,第5.7节“附加运算符”具有:

所以标准决定了结果.如果编译器可以确定可以通过不同的操作顺序获得相同的结果,那么它可以重新排列它们.但无论这种情况发生与否,您都无法辨别出差异.

大佬总结

以上是大佬教程为你收集整理的我可以保证C编译器不会重新排序我的计算吗?全部内容,希望文章能够帮你解决我可以保证C编译器不会重新排序我的计算吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。