3733: 定点数(第六轮03)
题目描述
计算机在处理大多数问题时,都免不了与小数打交道。对于“确切”的计算机来说, “不确切”的小数自然而然显得格格不入。科学家们提出了两种方式来解决这个棘 手的问题——定点数与浮点数,而我们今天要讨论的主题便是定点数。
顾名思义,在采用定点数表示小数时,小数点隐含在某一个固定的位置上。例如, 现有一个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出现的情况)。