2.6 精确表达浮点数

2.6 精确表达浮点数

基本问题:在计算机中,一般使用float和double来表示浮点数,但是由于计算机本身硬件的限制,不能够很准确的表示小数,为了得到精确的结果,用分数来表示小数,如果一个小数是无限小数,我们假设它是无限循环小数。

解法

经题目可得,我们输入的数字主要有两种

  • 一种是有限小数

\[X = 0.a_1a_2...a_n \]

\[X = \frac{a_1a_2...a_n}{10^n} \]

然后再对分子分母进行最大公约数化简即可gcd

  • 一种是无限循环小数

\[X = 0.a_1a_2...a_n(b_1b_2...b_m) \]

其中\((b_1b_2...b_m)\)是循环体

\[X = 0.a_1a_2...a_n(b_1b_2...b_m) \]

\[10^n * X = a_1a_2...a_n.b_1b_2...b_m \]

\[10^n * X = a_1a_2...a_n + 0.b_1b_2...b_m \]

\[X = frac{a_1a_2...a_n + 0.b_1b_2...b_m}{10^n} \]

再看循环体

\[Y = 0.b_1b_2...b_m \]

\[10^m * Y = b_1b_2...b_m.b_1b_2...b_m \]

\[10^m *Y - Y = b_1b_2...b_m \]

\[Y = \frac{b_1b_2...b_m}{10^m-1} \]

将上式带入X的表达式中得

\[X = \frac{a_1a_2...a_n}{10^n} + \frac{b_1b_2...b_m}{10^n*(10^m - 1)} \]

上一篇:Arduino R3 红外接收控制小坦克程序


下一篇:Ajax请求内嵌套Ajax请求的方法