在C中说“推动一切浮动”的确定性方式

鉴于我更喜欢​​将程序中的数字保留为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.

但说实话,海事组织最好只是写一个命名的功能.

相关文章

首先GDB是类unix系统下一个优秀的调试工具, 当然作为debug代...
1. C语言定义1个数组的时候, 必须同时指定它的长度.例如:int...
C++的auto关键字在C+⬑新标准出来之前基本...
const关键字是用于定义一个不该被改变的对象,它的作用是告诉...
文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...