#P7022. 定点数
定点数
题目描述
计算机在处理大多数问题时,都免不了与小数打交道。对于“确切”的计算机来说,“不确切”的小数自然而然显得格格不入。科学家们提出了两种方式来解决这个棘手的问题——定点数与浮点数,而我们今天要讨论的主题便是定点数。
顾名思义,在采用定点数表示小数时,小数点隐含在某一个固定的位置上。例如,现有一个8位二进制定点数,规定整数部分占4位、小数部分占4位,则二进制定点数10101000(带小数点时表示为1010.1000),即为十进制下的10.5。
阅读了上面介绍,相信聪明的你一定明白了定点数的概念,能够灵活运用这一数据类型了。那么,这里有一道关于定点数的问题,赶快来试试看吧!
给定两个十进制小数p, q和一个算符(+、-、*、/,分别表示加、减、乘、除),请你分别将他们转换为32位二进制定点数,并尝试通过定点数运算得到运算结果。
为方便计算,本题中所有数据的类型均为无符号型(包括输入的十进制小数、运算结果的最终表示等)。运算时,本题规定一个32位二进制定点数的整数部分占24位,小数部分占8位。出现精度损失时,最小化因精度损失带来的误差(也即,若定点数p和q为两个相邻的定点数、待转换的定点数为x,当 时,你需要输出p,否则你需要输出q)。输出时,你需要将定点数转换为十进制小数形式输出,并保留至小数点后8位。
输入格式
第一行包含两个十进制小数p和q。
第二行包含一个算符op 。
输出格式
第一行包含两个十进制小数u和v,表示转换结果。
第二行包含一个十进制小数r,表示运算结果。
样例
1.0 2.5
+
1.00000000 2.50000000
3.50000000
【说明】
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。
0.03125 0.03125
*
0.03125000 0.03125000
0.00000000
【说明】
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。
0.5 1.0
-
0.50000000 1.00000000
16777215.50000000
【说明】
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。
8388608.0 0.25
/
8388608.00000000 0.25000000
0.00000000
【说明】
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。
0.3 1.2
+
0.30078125 1.19921875
1.50000000
【说明】
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。
1.2 0.3
-
1.19921875 0.30078125
0.89843750
【说明】
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出现的情况)。
相关
在以下作业中: