簡體   English   中英

Java雙epsilon

[英]Java double epsilon

我目前需要一個double類型的epsilon (首選是java庫中的常量而不是自己的實現/定義)

據我所知, DoubleMIN_VALUEMAX_VALUE作為靜態成員。

為什么沒有EPSILON

epsilon<double>會是什么?

std::numeric_limits< double >::epsilon()有什么區別嗎?

Epsilon:1和大於1的最小值之間的差異,可以表示數據類型。

我認為你的意思是價值錯誤意義上的epsilon。 就是這個

如果是這樣,那么在Java中它被稱為ULP(最后一個單位)。 您可以使用java.lang.Math包和Math.ulp()方法找到它。 在這里查看javadocs

該值不會存儲為靜態成員,因為它會根據您所關注的雙精度而有所不同。

編輯:根據OP現在在問題中對epsilon的定義,1.0的兩倍的ULP是2.220446049250313E-16,表示為double。 (即Math.ulp(1.0)的返回值Math.ulp(1.0) 。)

不使用Math包:

Double.longBitsToDouble(971l << 52)        

這是2 ^ -52(971 = 1023(雙指數偏差) - 52,偏移52是因為尾數存儲在前52位)。

它比Math.ulp(1.0)快一點;

此外,如果您需要比較雙值,那么這篇文章非常有用: https//randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

通過編輯問題,解釋EPSILON含義,問題現在已經很清楚了,但最好指出以下內容:

我相信原始問題是由於在C中有一個常量DBL_EPSILON ,在標准頭文件float.h定義,它捕獲了問題所指的內容。 相同的標准頭文件包含常量DBL_MINDBL_MAX定義,它們分別清楚地對應於Java中的Double.MIN_VALUEDouble.MAX_VALUE 因此,很自然地假設Java也應該包含類似Double.EPSILON的定義,其含義與C中的DBL_EPSILON相同。但是,事實並非如此。 更奇怪的是,C# 確實包含一個定義double.EPSILON ,但它有不同的含義,即C中由常量DBL_MIN覆蓋的DBL_MIN ,在Java中由Double.MIN_VALUE覆蓋。 當然這種情況可能導致一些混亂,因為它使EPSILON這個詞含糊不清。

double:雙精度數據類型是雙精度64位IEEE 754浮點數。 其值范圍超出了本討論的范圍,但在Java語言規范的浮點類型,格式和值部分中指定。 對於十進制值,此數據類型通常是默認選擇。 如上所述,此數據類型不應用於精確值,例如貨幣。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

仰望IEEE 754你會發現epsion的精確度......

http://en.wikipedia.org/wiki/IEEE_floating_point

binary64:

  • 鹼(B)= 2
  • 精度(P)= 53
  • machineEpsion(e)(b ^ - (p-1))/ 2 = 2 ^ -53 = 1.11e-16
  • machineEpsilon(e)b ^ - (p-1)= 2 ^ -52 = 2.22e-16

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM