我在这里读到:
根据C99§6.3.1.4脚注50:
当将实数浮点类型的值转换为无符号类型时,无需执行将整数类型的值转换为无符号类型时执行的剩余操作.因此,便携式实际浮动值的范围是(-1,Utype_MAX + 1).
现在,我对以下之间的细微差别感兴趣(这次是C++ 03!)
double d1 = 257;
double d2 = -2;
unsigned char c1 = d1; // undefined, since d1 > 256
unsigned char c2 = d2; // undefined, since d2 < -1
Run Code Online (Sandbox Code Playgroud)
和
double d1 = 257;
double d2 = -2;
unsigned int i1 = d1; // defined, since d1 <= 2^32
unsigned int i2 = d2; // still undefined, right?
unsigned char c1 = i1; // defined, modulo 2^8, so …Run Code Online (Sandbox Code Playgroud) 在IEEE 754浮点中,有可能
a*(b-c) != a*b-a*c // a, b, c double
Run Code Online (Sandbox Code Playgroud)
因此,产品的扩展不能保证等于未扩展的产品.
但是这个怎么样:
a*(b1+b2+...+bn) == a*b1+a*b2+...+a*bn // b1==b2==...==bn
Run Code Online (Sandbox Code Playgroud)
当所有b相等时,保证等价(如果没有欠/溢)?如果b在编译时知道相等性是否存在差异?
编辑:
事实并非如此 - 请参阅Eric Postpischil和Pascal Cuoq.
但也许持有较弱的断言?:
(1.0/n)*(b1+b2+...+bn) <= 1.0
&& (1.0/n)*b1+(1.0/n)*b2+...+(1.0/n)*bn <= 1.0
// when all b<=1.0 and n integral double but not power of 2
// so that 1.0/n not exactly representable with base-2 floating point
Run Code Online (Sandbox Code Playgroud)
我只是想知道你是否可以保证数据集的平均值不会超过每个数据值也不会超过的某个值,无论你如何计算平均值(首先添加和一次分割,或者添加每个分割的值) .
EDIT2:
好吧,&&不成立.见Eric Postpischil和David Hammen:
average of nine 1.0 …Run Code Online (Sandbox Code Playgroud) 对于C++ 03,标准说,在&&运算符的左右操作数之间有一个序列点,因此左操作符的所有副作用都发生在访问右操作符之前.
所以
int i = 0;
if (++i && i--)
std::cout << i;
Run Code Online (Sandbox Code Playgroud)
定义明确,保证输出0.
但是这个问题是什么:只有左操作数不是,才评估右操作数0?它似乎是一个细节,但对我来说,标准只保证操作数之间的序列点,而不是右操作数永远不会依赖于左操作数进行评估/访问.
例如
int arr[10];
int pos; // somehow set to a value from 0 to 10
while (pos < 10 && arr[pos] != 0)
pos++;
Run Code Online (Sandbox Code Playgroud)
这个定义得很好吗?pos可能是从开始10或到达10.左操作数没有副作用,与右操作数一致.我arr[10] != 0有从未履行的保证吗?
编辑:
感谢评论和回答,现在很清楚:
5.14p2: "The result is a bool. If the second expression is evaluated,
every value computation …Run Code Online (Sandbox Code Playgroud) c++ operator-precedence undefined-behavior sequence-points c++03
因为我在讨论中被告知"通过不兼容的指针类型进行别名是未定义的行为"(例如,double d; int *p = (int *)&d;以下问题:
它是否允许转换(double *)为(double **),例如double *d1; double **d2 = &d2 和使用类似于d2[0][y]期望的语法d1[y]?
我知道它不是通过不兼容的指针类型完全混淆,但是我不确定.背景是我想要一个在二维数组(=图像)上运行的函数,但我希望能够只传递图像的一行或一列.