#P7022. 定点数

    ID: 1936 传统题 文件IO:number 1000ms 256MiB 尝试: 1 已通过: 0 难度: 10 上传者: 标签>数学位运算牛客OI模拟赛CSP-J

定点数

题目描述

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

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

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

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

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