摘要
有時候您會對一個類熟悉到忘記了它的存在
Java
抽象實數(如 π 或
計算機算法(Java 語言和其他語言的算法)的第二個限制是它基於二進制而不是十進制
這種不精確性是迫切需要一個 math 類的最主要的原因之一
清單
public class SineTaylor {
public static void main(String[] args) {
for (double angle =
System
+
}
}
public static double degrees(double radians) {
return
}
public static double taylorSeriesSine(double radians) {
double sine =
int sign =
for (int i =
sine += Math
sign *=
}
return sine;
}
private static double factorial(int i) {
double result =
for (int j =
result *= j;
}
return result;
}
}
開始運行得不錯
但是
這裡使用泰勒級數得到的結果實際上比我想像的要精確
泰勒級數的效率也無法與現代桌面芯片的內置正弦函數相比
直角三角形和歐幾裡德范數
每個高中學生都學過勾股定理
學習過大學物理和高等數學的同學會發現
Java
public static double hypot(double x
return x*x + y*y;
}
實際代碼更復雜一些
清單
的實際代碼/*
* ====================================================
* Copyright (C)
*
* Developed at SunSoft
* Permission to use
* software is freely granted
* is preserved
* ====================================================
*/
#include
#ifdef __STDC__
double __ieee
#else
double __ieee
double x
#endif
{
double a=x
int j
ha = __HI(x)&
hb = __HI(y)&
if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
__HI(a) = ha; /* a <
__HI(b) = hb; /* b <
if((ha
k=
if(ha >
if(ha >=
w = a+b; /* for sNaN */
if(((ha&
if(((hb^
return w;
}
/* scale a and b by
ha
__HI(a) = ha;
__HI(b) = hb;
}
if(hb <
if(hb <=
if((hb|(__LO(b)))==
t
__HI(t
b *= t
a *= t
k
} else { /* scale a and b by
ha +=
hb +=
k
__HI(a) = ha;
__HI(b) = hb;
}
}
/* medium size a and b */
w = a
if (w>b) {
t
__HI(t
t
w = sqrt(t
} else {
a = a+a;
y
__HI(y
y
t
__HI(t
t
w = sqrt(t
}
if(k!=
t
__HI(t
return t
} else return w;
}
實際上
這段代碼(以及 Sun Java 開發庫中的大多數其他本機數學代碼)來自 Sun 約
以
對數說明一個底數的幾次冪等於一個給定的值
從 Java
清單
清單
public static void main(String[] args) {
for (int i =
System
Math
Math
lg(i));
}
}
public static double lg(double x) {
return Math
}
}
下面是前
Math
立方根
我不敢說我的生活中曾經需要過立方根
清單
public class CubeRoots {
public static void main(String[] args) {
for (int i =
System
}
}
}
下面是結果
結果顯示
雙曲三角函數
雙曲三角函數就是對曲線應用三角函數
x = r cos(t)
y = r sin(t)
您會得到以 r 為半徑的曲線
x = r cosh(t)
y = r sinh(t)
則會得到一個正交雙曲線
還可以這樣思考
Java
實際上
清單
import java
public class Catenary extends Frame {
private static final int WIDTH =
private static final int HEIGHT =
private static final double MIN_X =
private static final double MAX_X =
private static final double MAX_Y =
private Polygon catenary = new Polygon();
public Catenary(String title) {
super(title);
setSize(WIDTH
for (double x = MIN_X; x <= MAX_X; x +=
double y = sh(x);
int scaledX = (int) (x * WIDTH/(MAX_X
int scaledY = (int) (y * HEIGHT/MAX_Y);
// in computer graphics
// Caretesian coordinates
scaledY = HEIGHT
catenary
}
}
public static void main(String[] args) {
Frame f = new Catenary(
f
}
public void paint(Graphics g) {
g
}
}
圖
圖
雙曲正弦
符號
Math
一個 float 和一個 double 版本可用來維護這種類型
清單
public static double signum(double x) {
if (x ==
else if (x <
else return
}
首先
清單
public static double signum(double d) {
return (d ==
}
public static double copySign(double magnitude
return rawCopySign(magnitude
}
public static double rawCopySign(double magnitude
return Double
(DoubleConsts
(Double
(DoubleConsts
DoubleConsts
}
事半功倍
最有效的代碼是從您未編寫過的代碼
參考資料
您可以參閱本文在 developerWorks 全球網站上的 英文原文
類型
二進制浮點運算的 IEEE 標准
java
Bug
關於作者
Elliotte Rusty Harold 出生在新奧爾良
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26110.html