C. 量化寄存器

    传统题 1000ms 128MiB

量化寄存器

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

量化寄存器

题目描述

某控制器使用一个 3232 位无符号寄存器保存非负小数,其中高 2424 位为整数部分,低 88 位为小数部分。也就是说,寄存器中保存的无符号整数 XX 表示实数

X256.\frac{X}{256}.

可表示的原始整数范围为 0X<2320\le X<2^{32}

现在给定两个非负十进制小数 p,qp,q 和一个运算符 op{+,,,/}op\in\{+,-,*,/\}。首先分别把 p,qp,q 转换为最接近的可表示数;若一个数恰好位于两个相邻可表示数的中点,则向较大的那个数舍入。设转换后的原始整数分别为 P,QP,Q

随后在寄存器中进行一次运算。运算规则如下:

  • 加法:R=(P+Q)mod232R=(P+Q)\bmod 2^{32}
  • 减法:R=(PQ)mod232R=(P-Q)\bmod 2^{32}
  • 乘法:先将 PQ256\dfrac{PQ}{256} 按上述规则舍入到最近整数,再对 2322^{32} 取模;
  • 除法:先将 256PQ\dfrac{256P}{Q} 按上述规则舍入到最近整数,再对 2322^{32} 取模。

除法数据保证 Q0Q\ne 0

你需要输出两个输入数转换后的实际值,以及运算结果 R/256R/256。所有输出均保留小数点后 88 位。

输入格式

第一行包含两个非负十进制小数 p,qp,q

第二行包含一个字符 opop,为 +-*/ 中的一个。

输出格式

第一行输出两个小数,依次表示 P/256P/256Q/256Q/256

第二行输出一个小数,表示 R/256R/256

三个数均保留小数点后 88 位。

样例 1 输入

0.1 0.2
+

样例 1 输出

0.10156250 0.19921875
0.30078125

样例 2 输入

0.25 1.0
-

样例 2 输出

0.25000000 1.00000000
16777215.25000000

样例 2 说明

减法得到负数时,按 3232 位无符号整数的规则发生回绕。

样例 3 输入

1.5 2.25
*

样例 3 输出

1.50000000 2.25000000
3.37500000

数据范围与说明

  • p,qp,q 均位于 [0,224)[0,2^{24}),并保证转换后的原始整数位于 [0,232)[0,2^{32})
  • 四种运算各占全部数据的 25%25\%
  • 至少 10%10\% 的数据在输入转换时不会产生精度损失;
  • 至少 20%20\% 的数据在运算时不会发生向零舍入造成的下溢;
  • 至少 20%20\% 的数据在运算时不会发生超出 3232 位后回绕的上溢。

本题共 4040 个等分测试点。

test

未参加
状态
已结束
规则
IOI
题目
4
开始于
2026-7-13 14:00
结束于
2026-7-13 17:00
持续时间
3 小时
主持人
参赛人数
8