如何将表达式从C++转换为java 我试图把C++表达式转换成java,我不是C++程序员,我知道有一些左移位正在进行。但我不完全明白手术室应该做什么。有人能解释一下,或者用Java提供一个等价的表达式吗 newval += ((t > val) || (std::abs(t-val) < std::numeric_limits<float>::epsilon())) << n;

如何将表达式从C++转换为java 我试图把C++表达式转换成java,我不是C++程序员,我知道有一些左移位正在进行。但我不完全明白手术室应该做什么。有人能解释一下,或者用Java提供一个等价的表达式吗 newval += ((t > val) || (std::abs(t-val) < std::numeric_limits<float>::epsilon())) << n;,java,Java,表情 ((t > val) || (std::abs(t-val) < std::numeric_limits<float>::epsilon())) 是C++中的BoL,它隐式地转换为无符号整数,即0为false或1为真。你是对的,关于表达式的bool部分,有几件事让我困惑,请看@NicholasM的答案: 1绝对值的使用。如果t>val,则不会计算快捷方式或运算符| |的右侧。因此,表达式的布尔部分等效于: ((t > val) || ((t-val) >

表情

((t > val) || (std::abs(t-val) < std::numeric_limits<float>::epsilon()))

是C++中的BoL,它隐式地转换为无符号整数,即0为false或1为真。你是对的,关于表达式的bool部分,有几件事让我困惑,请看@NicholasM的答案:

1绝对值的使用。如果t>val,则不会计算快捷方式或运算符| |的右侧。因此,表达式的布尔部分等效于:

((t > val) || ((t-val) > std::numeric_limits<float>::epsilon()))
我会用Java编写如下代码:

newval += (t > val) ? 1<<n : 0;
实际上,我也会在C++中这样编码,因为它让我的意图对读者来说更加明显。一个好的编译器在任何一种情况下都应该发出相同的机器语言指令

3我将表达式的布尔部分理解为t大于val,或t显著大于val,其中显著定义为绝对差值大于机器ε。我甚至不想问这个惊人的巧合:也就是说,为什么机器ε恰好是表示特定数据重要性的正确数量级


4你为什么用浮动计算?浮点数据类型IEEE 32位二进制格式在节省空间的存储是高优先级的情况下对存储数字很有用,但使用双IEEE 64位二进制进行计算几乎总是更好。

java.lang.Math包中的哪个函数与std::numeric_limits::epsilon等效,这可能不是很明显。实际上没有返回机器ε的函数,但可以这样计算:Math.nextAfter1.0f,2.0f-1.0fOops!我错过了。我从来没有在科学计算中使用过Java。我想它应该是Math.ulp1.0f for float?我不明白为什么人们会跟着C++标签感到恼火,并否决了这个问题,这是测试的好地方。然而,or条件的第二部分相关的一种情况是精确浮点相等。如果t==val,则t-val==0.0,第二个测试为真。另一个要考虑的是,对于小于1的值,即具有较小的浮点指数,有可能是T<Var,并且两者之间的差值小于ε,等于1的ULP。
newval += (t > val) ? 1<<n : 0;