3733: 定点数(第六轮03)

内存限制:256 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:2 解决:1

题目描述

计算机在处理大多数问题时,都免不了与小数打交道。对于“确切”的计算机来说, “不确切”的小数自然而然显得格格不入。科学家们提出了两种方式来解决这个棘 手的问题——定点数与浮点数,而我们今天要讨论的主题便是定点数。

顾名思义,在采用定点数表示小数时,小数点隐含在某一个固定的位置上。例如,  现有一个8位二进制定点数, 规定整数部分占4位、小数部分占4位, 则二进制定 点数10101000(带小数点时表示为1010.1000),即为十进制下的10.5。

阅读了上面介绍,相信聪明的你一定明白了定点数的概念,能够灵活运用这一数 据类型了。那么,这里有一道关于定点数的问题,赶快来试试看吧!

给定两个十进制小数p, q和一个算符(+  −  * /,分别表示加、减、乘、除),  请你分别将他们转换为32位二进制定点数,并尝试通过定点数运算得到运算结 果。

为方便计算,本题中所有数据的类型均为无符号型(包括输入的十进制小数、运 算结果的最终表示等)。运算时,本题规定一个32位二进制定点数的整数部分占 24位,小数部分占8位。出现精度损失时, 最小化因精度损失带来的误差(也即, 若定点数p和q为两个相邻的定点数、待转换的定点数为x,当p ≤ x < (p + q)/2 时, 你需要输出p, 否则你需要输出q)。输出时,  你需要将定点数转换为十进制

小数形式输出,并保留至小数点后8位。

输入

第一行包含两个十进制小数p和q 。

 第二行包含一个算符op  。

输出

第一行包含两个十进制小数u和v,表示转换结果。 

第二行包含一个十进制小数r,表示运算结果。

样例输入 复制

1.0 2.5
+

样例输出 复制

1.00000000 2.50000000
3.50000000

提示

【样例 1 输入】

1.0 2.5

+

【样例 1 输出】

1.00000000 2.50000000

3.50000000

【样例 1 说明】

p     的          1.0                   32                                0000 0000 0000 0000 0000 0001.0000 0000,也即十进制表示下的1.0。

q                 2.5   ,    转   换         32     位    二   进    制   定    点   数    为 0000 0000 0000 0000 0000 0010.1000 0000,也即十进制表示下的2.5。

两个定点数求和,结果为0000 0000 0000 0000 0000 0011.1000 0000,也即十进 制表示下的3.5。

【样例 2 输入】

0.03125 0.03125

*

【样例 2 输出】

0.03125000 0.03125000

0.00000000

【样例 2 说明】

p      q          0.03125             32        进  制  定  点  数  为 0000 0000 0000 0000 0000 0000.0000 1000,也即十进制表示下的0.03125。

两个定点数相乘,结果为0000 0000 0000 0000 0000 0000.0000 0000 (1000), 此时乘积结果已经超出了定点数所能表示的范围(上述示例用括号补充出了正确 的运算结果),因此在十进制表示下为 0.0。

【样例 3 输入】

0.5 1.0

-

【样例 3 输出】

0.50000000 1.00000000

16777215.50000000

【样例 3 说明】

p     的          0.5                   32                                0000 0000 0000 0000 0000 0000.1000 0000,也即十进制表示下的 0.5。

q               1.0                    32     位    二   进    制   定    点   数    为 0000 0000 0000 0000 0000 0001.0000 0000,也即十进制表示下的1.0。

两个定点数作差,结果为1111 1111 1111 1111 1111 1111.1000 0000,也即十进 制表示下的16777215.5。

【样例 4  输入】

8388608.0 0.25 /

【样例 4  输出】

8388608.00000000 0.25000000

0.00000000

【样例 4 说明】

p             8388608.0   ,            32                          1000 0000 0000 0000 0000 0000.0000 0000         进      示  下  的 8388608.00000000。

q                0.25                   32                               0000 0000 0000 0000 0000 0000.0100 0000,也即十进制表示下的0.25。

两个定点数作商,结果为(0010) 0000 0000 0000 0000 0000 0000.0000 0000, 此时乘积结果已经超出了定点数所能表示的范围(上述示例用括号补充出了正确

的运算结果),因此在十进制表示下为 0.0。

【样例 5 输入】

0.3 1.2

+

【样例 5 输出】

0.30078125 1.19921875

1.50000000

【样例 5 说明】

p     的          0.3                   32                                 0000 0000 0000 0000 0000 0000.0100 1101,也即十进制表示下的0.30078125。

q     的           1.2                   32                                 0000 0000 0000 0000 0000 0001.0011 0011,也即十进制表示下的1.19921875。

两个定点数求和,结果为0000 0000 0000 0000 0000 0001.1000 0000,也即十进 制表示下的1.5。

【样例 6 输入】

1.2 0.3

-

【样例 6 输出】

1.19921875 0.30078125

0.89843750

【样例 6 说明】

p     的          1.2                   32                                 0000 0000 0000 0000 0000 0001.0011 0011,也即十进制表示下的1.19921875。 q     的          0.3                    32                                0000 0000 0000 0000 0000 0000.0100 1101,也即十进制表示下的0.30078125。 两个定点数作差,结果为0000 0000 0000 0000 0000 0000.1110 0110,也即十进  制表示下的0.89843750。

【数据范围】

对于全部测试数据,25% 的数据运算为加法,

25% 的数据运算为减法,

25%的数 据运算为乘法,

25% 的数据运算为除法。保证除法运算时, 小数转换为定点数后 不为0。

特别的,有至少10%的数据在类型转换时不会出现精度损失,另有至少20%的数 据计算时不会出现下溢(即样例 2出现的情况),另有至少20%的数据计算时不会 出现上溢(即样例4出现的情况)。


来源/分类