Java忽略算术溢出,IEEE-754:“最小”溢出条件
Before I start, just some background information:
我正在使用編譯器標準數學庫(符合IEEE-754)在Keil uVision3中編譯的ARM7微控制器(LPC2294 / 01)上運行裸機應用程序 .
The issue: I 'm having trouble wrapping my head around what exactly constitutes an '溢出'對2個單精度浮點輸入的總和 .
最初,我的印象是,如果我試圖將任何正值添加到可以用IEEE-754表示法表示的最大值,結果將產生溢出異常 .
例如,假設我有:
a = 0x7f7fffff (ie. 3.4028235..E38);
b = 0x3f800000 (ie. 1.0)
我期望將這兩個值相加會導致IEEE-754中定義的溢出 . 令我最初的驚訝,結果只返回'a'的值,沒有標記異常 .
所以我想,因為精確度(或者你喜歡的分辨率)隨著所表示的值的增加而減小,所以在這種情況下,值“1”可能由于其相對不重要而有效地向下舍入到0 .
So that begged the question: 在這種情況下,'b'的最小值會導致溢出異常嗎?它取決于IEEE-754的具體實現嗎?
也許就像我不了解如何在這種特殊情況下確定最小“重要”精度一樣簡單,但是考慮到下面的代碼,為什么第二個和會導致溢出而不是第一個?
static union sFloatConversion32
{
unsigned int unsigned32Value;
float floatValue;
} sFloatConversion32;
t_bool test_Float32_Addition(void)
{
float a;
float b;
float c;
sFloatConversion32.unsigned32Value = 0x7f7fffff;
a = sFloatConversion32.floatValue;
sFloatConversion32.unsigned32Value = 0x72ffffff;
b = sFloatConversion32.floatValue;
/* This sum returns (c = a) without overflow */
c = a + b;
sFloatConversion32.unsigned32Value = 0x73000000;
b = sFloatConversion32.floatValue;
/* This sum, however, causes an overflow exception */
c = a + b;
}
是否存在可以應用的通用規則,使得可以提前知道(即,不執行總和),給定兩個浮點數,它們的總和將導致IEEE-754定義的溢出?
總結
以上是生活随笔為你收集整理的Java忽略算术溢出,IEEE-754:“最小”溢出条件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 蜂窝网格,blender怎
- 下一篇: java用什么编译器_用大白话告诉你,J