Il metodo standard Math.sqrt()
sembra già abbastanza veloce in Java, ma ha lo svantaggio intrinseco che implica sempre operazioni a 64 bit che non fanno altro che ridurre la velocità quando si tratta di valori a 32 bit float
. È possibile fare meglio con un metodo personalizzato che utilizza un parametro float
, esegue solo operazioni a 32 bit e restituisce un risultato come float
?Java: implementazione fp a 32 bit di Math.sqrt()
vidi:
Fast sqrt in Java at the expense of accuracy
e ha fatto poco più che rafforzare l'idea che Math.sqrt() è generalmente difficile da battere. Ho visto anche:
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
che mi ha mostrato un sacco di interessanti C++ hack/ASM che io sono semplicemente troppo ignorante per porta direttamente a Java. Benchè sqrt14 potrebbe essere interessante come parte di una chiamata JNI. . .
Ho anche guardato ad Apache Commons FastMath, ma sembra che la libreria abbia come predefinito lo standard Math.sqrt(), quindi non ci aiuto. E poi c'è Yeppp !:
ma non ho disturbato con ancora.
Io non sono molto sicuro che avrai il vantaggio di velocità si spera si otterrebbe –
"operazioni a 64 bit. .. non fa altro che ridurre la velocità quando si ha a che fare con valori float a 32 bit "è un errore. In generale, le operazioni in virgola mobile vengono sempre eseguite nella precisione della FPU, e il sovraccarico arriva ad allargare e restringere gli operandi 'float' a' double' per adattarsi alla FPU. – EJP
@EJP è vero per 'sqrtsd' vs' sqrtss', ma ovviamente da una prospettiva Java non è possibile controllarlo. Per quanto riguarda la FPU vecchio stile che funziona come descriveresti, è essenzialmente obsoleto (e gravemente azzoppato in alcuni Intel Atom) – harold