[英]Java v Python floating point arithmetic
我正在嘗試將一些 Java 代碼轉換為 Python,但似乎遇到了浮點精度問題。
我無法更改 Java 代碼,因此解決方案需要在 Python 中。
Java代碼:
float Ax = -0.13044776f;
float Ay = -0.17653446f;
float Az = 9.8041935f;
final float Ex = -40.55481f;
final float Ey = -22.624207f;
final float Ez = -57.284546f;
float Hx = Ey * Az - Ez * Ay;
在 Java 中, Hx
的值為-231.9248
Python代碼:
Ax = -0.13044776
Ay = -0.17653446
Az = 9.8041935
Ex = -40.55481
Ey = -22.624207
Ez = -57.284546
Hx = float(Ey * Az - Ez * Ay)
在 Python 中, Hx
的值為-231.92479960650965
為什么 Python 中有更多的精度點,以及如何復制 Java 的行為?
在 Java 代碼中將float
更改為double
。 現在,當您在號碼中保留f
后綴時, Hx
將包含-231.9247949756118
,如果您刪除它,則包含-231.92479960650965
。 您需要了解浮點數具有內在的不精確性。 在 Java 中,如果您需要精確的精度,則需要使用BigDecimal
class:
BigDecimal Ax = new BigDecimal( "-0.13044776" );
BigDecimal Ay = new BigDecimal( "-0.17653446" );
BigDecimal Az = new BigDecimal( "9.8041935" );
BigDecimal normsqA = Ax.multiply( Ax ).add( Ay.multiply( Ay ).add( Az.multiply( Az ) ) );
BigDecimal g = new BigDecimal( "9.81" );
BigDecimal freeFallGravitySquared = new BigDecimal( "0.01" ).multiply( g ).multiply( g );
BigDecimal Ex = new BigDecimal( "-40.55481" );
BigDecimal Ey = new BigDecimal( "-22.624207" );
BigDecimal Ez = new BigDecimal( "-57.284546" );
BigDecimal Hx = Ey.multiply( Az ).subtract( Ez.multiply( Ay ) );
System.out.println( Hx );
現在, Hx
包含-231.92479960650966
。
我認為您可以將 Python 中的值四舍五入以“模擬”您需要的精度較低。 就像是:
Hx = round( float(Ey * Az - Ez * Ay), 4 )
正如其他人所說:不要使用float
,而是使用double
精度,因為它具有更高的精度來匹配 Python 正在使用的精度。 另請注意,您需要將文字更改為不被聲明為floats
(如-0.13044776
f
是)
double Ax = -0.13044776;
double Ay = -0.17653446;
double Az = 9.8041935;
final double normsqA = (Ax * Ax + Ay * Ay + Az * Az);
final double g = 9.81;
final double freeFallGravitySquared = 0.01 * g * g;
final double Ex = -40.55481;
final double Ey = -22.624207;
final double Ez = -57.284546;
double Hx = Ey * Az - Ez * Ay;
System.out.println(Hx);
// result: -231.92479960650965 matching Python exactly
我已經用其他人在這里分享的知識回答了我自己的問題。
numpy
具有float32
數據類型https://numpy.org/doc/stable/reference/arrays.scalars.html#numpy.float32
Python代碼
Ax = float32(-0.13044776)
Ay = float32(-0.17653446)
Az = float32(9.8041935)
Ex = float32(-40.55481)
Ey = float32(-22.624207)
Ez = float32(-57.284546)
Hx = Ey * Az - Ez * Ay
Hx
現在是-231.9248
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.