Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较浮点及其副本_Java_C_Comparison_Double_Malloc - Fatal编程技术网

Java 比较浮点及其副本

Java 比较浮点及其副本,java,c,comparison,double,malloc,Java,C,Comparison,Double,Malloc,我知道,如果从不同的计算中获得两个双精度,那么比较它们是有问题的。但当其中一个是另一个的副本(价值)时,这是否也适用。下面几行解释了这个场景。如果我有这样的问题 double a,b; a=randdouble();/*some double value*/ b=a; 那么 Q1)对于C编译器(我有gcc 6.1.1),比较a==b是否总是保证返回true 问题2)如果我使用malloc在堆内存中分配变量a和b,上述答案会保持不变吗 问题3)如果我用JAVA编译器替换C编译器(我使用的是Ope

我知道,如果从不同的计算中获得两个双精度,那么比较它们是有问题的。但当其中一个是另一个的副本(价值)时,这是否也适用。下面几行解释了这个场景。如果我有这样的问题

double a,b;
a=randdouble();/*some double value*/
b=a;
那么

Q1)对于C编译器(我有
gcc 6.1.1
),比较
a==b
是否总是保证返回
true

问题2)如果我使用
malloc
在堆内存中分配变量
a
b
,上述答案会保持不变吗

问题3)如果我用JAVA编译器替换C编译器(我使用的是
OpenJDK1.7.0
),当然要进行必要的语法更改,上述答案是否会保持不变


编辑1:数字
a
b
!=NaN

Q1:比较结果不能保证为真,原因很简单,
NaN
比较结果与自身不相等。可能还有其他情况,但
NaN
显然是一个反例

问题2:变量驻留在内存中的位置没有区别

问题3:我希望Java也会有类似的表现

撇开这一特殊情况不谈,我相信标准并没有提供这样的保证:


想象一个ABI,其中计算
double
表达式并返回80位精度的值(Intel 80x87堆栈),但存储为64位IEEE-754 double。即使将
randdool()
定义为返回
double
,与
long double
相反,其返回值可能比存储在
a
b
中的值更精确。根据编译器如何优化
randdouble()
函数调用和比较
a==b
之间的各种表达式,它可能最终将80位精确返回值与其通过转换为64位并返回80位获得的近亲值进行比较。如果转换过程中精度丢失,比较将失败。我将尝试从标准中找到一个适当的引用来支持这一点,但这似乎是合理的,尽管
a
b
是本地变量还是存储在堆中可能会对执行的转换顺序产生影响,对一种或另一种情况假设任何保证都是不明智的。

另一个答案说,NaN总是保证是不同的。这是IEEE-754浮点标准的定义。C和Java都将其用于浮点和双位表示,因此将NaN视为不同的

a=Double.NaN;
b=a;

if (a==b)   // <--- comparison will fail.
a=Double.NaN;
b=a;

如果(a==b)//1)否,2)是,3)yes@EugeneSh. 为什么
b=a
不会导致
b==a
为真。这是内存或寄存器的直接副本。@JoshSanford问题是关于保证。@Eugene Sh。出于好奇,为什么1会是否定的?我认为只要数字相同,与==的比较总是会返回true。@有些学生不一定会这样。但事实是(AFAIK)标准中没有这样的保证。我正在对
NaN
的存在进行故障保护检查。我将更新关于缺少
NaN
的问题。你能相应地更新你的答案吗?你所做的检查不会改变事实。@EugeneSh。怎么样?
伪随机
生成器能否生成
NaN
?您的问题是关于一般FP工作,而不是RNG或任何特殊情况。至少这是我和答案作者对它的理解。是否保证赋值运算符产生准确的位拷贝?如果是精确的位拷贝(NaN例外),是否保证比较操作始终返回true?我不这么认为,但我会寻找参考。@EugeneSh。我认为这是我进退两难的症结所在。赋值运算符产生的是精确的位拷贝。我认为您不应该依赖于此。如果您真的想精确复制一个对象并按位进行比较,请使用
memcpy
memcmp
。不过,我可能错了,因为我找不到好的参考资料。@EugeneSh。谢谢你的评论帮助我更恰当地重新表述了这个问题。让我们等待更多的答案,可能是参考资料。