簡體   English   中英

Java v Python 浮點運算

[英]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.

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