在C中说“推动一切浮动”的确定性方式
发布时间:2020-12-16 07:49:28 所属栏目:百科 来源:网络整理
导读:鉴于我更喜欢??将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么? 说,我有 int a,b,c,d;double x; 我想写 x=a/b/c/d+c/d+a; 通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱 x=(double)a/b/c/d+(dou
鉴于我更喜欢??将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?
说,我有 int a,b,c,d; double x; 我想写 x=a/b/c/d+c/d+a; 通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱 x=(double)a/b/c/d+(double)c/d+a; 是否可以使用C风格的宏(递归或不递归)?应该用新的类和重载操作符完成吗? 解决方法x=a/b/c/d+c/d+a; 这是一个非常复杂的表达.更好地给它一个名字: double complex_expression(double a,double b,double c,double d) { return a/b/c/d+c/d+a; } 现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double int a,d; // Init them somehow double x = complex_expression(a,d); 用C 11 lambda … int a,d; // Init them somehow double x = [](double a,double d) { return a/b/c/d+c/d+a; }(a,d); …工作,但海事组织看起来很笨拙. 稍好一点 double x = [a = (double)a,b = (double)b,c = (double)c,d = (double) d] { return a/b/c/d+c/d+a; }(); 哦,如果你有一些宏观的乐趣: #define SPLICE_2(l,r) l##r #define SPLICE_1(l,r) SPLICE_2(l,r) #define SPLICE(l,r) SPLICE_1(l,r) #define TREAT_AS(type,name) name = static_cast<type>(name) #define TREAT_ALL_AS_HELPER_0(type) #define TREAT_ALL_AS_HELPER_1(type,name) TREAT_AS(type,name) #define TREAT_ALL_AS_HELPER_2(type,name,...) TREAT_AS(type,name),TREAT_ALL_AS_HELPER_1(type,__VA_ARGS__) #define TREAT_ALL_AS_HELPER_3(type,TREAT_ALL_AS_HELPER_2(type,__VA_ARGS__) #define TREAT_ALL_AS_HELPER_4(type,TREAT_ALL_AS_HELPER_3(type,__VA_ARGS__) #define TREAT_ALL_AS_HELPER_5(type,TREAT_ALL_AS_HELPER_4(type,__VA_ARGS__) // expand as you will #define TREAT_ALL_AS(type,count,...) SPLICE(TREAT_ALL_AS_HELPER_,count)(type,__VA_ARGS__) 现在用作 double x = [TREAT_ALL_AS(double,4,a,d)] { return a/b/c/d+c/d+a; }(); 你也可以automatically count the number of variadic macro arguments. 但说实话,海事组织最好只是写一个命名的功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |