Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

立方根算法比较

在下表中,使用四种算法计算了 28 的立方根,分别使用了三种 基本(内置)类型 浮点类型,以及一种 Boost.Multiprecision 类型 cpp_bin_float,精度为 50 位十进制数字。

“精确”答案是使用 100 位十进制数字类型计算的

cpp_bin_float_100 full_answer ("3.036588971875662519420809578505669635581453977248111123242141654169177268411884961770250390838097895");

时间是使用 Boost.Timerclass cpu_timer 测量的。

立方根函数是一个简单的函数,是求根的一个人为示例。它确实允许我们研究一些控制效率的因素,这些因素可以推广到更复杂的函数。

使用的程序是 root_finding_algorithms.cpp。使用了每种浮点类型和算法的 100000 次评估,并且根据重复运行判断 CPU 时间的不确定性为 10%。比较 MSVC 中 doublelong double(在此平台上相同)可能会提供时间不确定性的指南。

请求的精度设置如下

函数

请求的精度

TOMS748

numeric_limits<T>::digits - 2

牛顿法

floor(numeric_limits<T>::digits * 0.6)

哈雷法

floor(numeric_limits<T>::digits * 0.4)

施罗德法

floor(numeric_limits<T>::digits * 0.4)

程序 root_finding_algorithms.cpp,Microsoft Visual C++ 版本 14.1,Dinkumware 标准库版本 650,Win32,x86
每个 5 种求根算法评估 1000000 次。

表 10.1. float、double、long double 和 cpp_bin_float_50 的立方根 (28)

float

double

long d

cpp50

   

算法

迭代次数

时间

归一化

距离

迭代次数

时间

归一化

距离

迭代次数

时间

归一化

距离

迭代次数

时间

归一化

距离

cbrt

0

78125

1.0

0

0

62500

1.0

1

0

93750

1.0

1

0

11890625

1.1

0

TOMS748

8

468750

6.0

-1

11

906250

15.

2

11

906250

9.7

2

6

80859375

7.6

-2

牛顿法

5

203125

2.6

0

6

234375

3.8

0

6

187500

2.0

0

2

10640625

1.0

0

哈雷法

3

234375

3.0

0

4

265625

4.3

0

4

234375

2.5

0

2

26250000

2.5

0

施罗德法

4

296875

3.8

0

5

281250

4.5

0

5

234375

2.5

0

2

32437500

3.0

0


程序 root_finding_algorithms.cpp,GNU C++ 版本 9.3.1 20200425,GNU libstdc++ 版本 20200425,Win32,x64
每个 5 种求根算法评估 1000000 次。

表 10.2. float、double、long double 和 cpp_bin_float_50 的立方根 (28)

float

double

long d

cpp50

   

算法

迭代次数

时间

归一化

距离

迭代次数

时间

归一化

距离

迭代次数

时间

归一化

距离

迭代次数

时间

归一化

距离

cbrt

0

15625

1.0

0

0

62500

1.0

0

0

62500

1.0

0

0

2718750

1.2

0

TOMS748

8

140625

9.0

-1

11

265625

4.2

2

10

718750

12.

-1

6

16796875

7.5

-2

牛顿法

5

62500

4.0

0

6

62500

1.0

0

6

203125

3.2

0

2

2234375

1.0

-1

哈雷法

3

46875

3.0

0

4

93750

1.5

0

4

234375

3.8

0

2

5187500

2.3

0

施罗德法

4

78125

5.0

0

5

78125

1.2

0

5

265625

4.2

0

2

6609375

3.0

0



PrevUpHomeNext