Floating-point numbers are represented differently in computers than integers. That is why a 32-bit
floating-point number can represent values in the magnitude of 1038 while a 32-bit integer can
only represent values as high as 232.
Although there are variations in the ways floating-point numbers are stored in Computers, in this
problem we will assume that floating-point numbers are stored in the following way:
Floating-point numbers have two parts mantissa and exponent. M -bits are allotted for mantissa and
E bits are allotted for exponent. There is also one bit that denotes the sign of number (If this
bit is 0 then the number is positive and if it is 1 then the number is negative) and another bit
that denotes the sign of exponent (If this bit is 0 then exponent is positive otherwise negative).
The value of mantissa and exponent together make the value of the floating-point number. If the
value of mantissa is m then it maintains the constraints 1 ≤ m < 1. The left most digit of mantissa
must always be 1 to maintain the constraint 1 ≤ m < 1. So this bit is not stored as it is always 1.
So the bits in mantissa actually denote the digits at the right side of decimal point of a binary
number (Excluding the digit just to the right of decimal point)
In the figure above we can see a floating-point number where M = 8 and E = 6. The largest value
this floating-point number can represent is (in binary) 0.1111111112 × 21111112 . The decimal
equivalent to this number is: 0.998046875 × 263 = 920535763834529382410. Given the maximum possible
value represented by a certain floating point type, you will have to find how many bits are
allotted for mantissa (M ) and how many bits are allotted for exponent (E) in that certain type.
Input
The input file contains around 300 line of input. Each line contains a floating-point number F that
denotes the maximum value that can be represented by a certain floating-point type. The floating
point number is expressed in decimal exponent format. So a number AeB actually denotes the value A
× 10B . A line containing ‘0e0’ terminates input. The value of A will satisfy the constraint 0 < A
< 10 and will have exactly 15 digits after the decimal point.
Output
For each line of input produce one line of output. This line contains the value of M and E. You can
assume that each of the inputs (except the last one) has a possible and unique solution. You can
also assume that inputs will be such that the value of M and E will follow the constraints: 9 ≥ M ≥
0 and 30 ≥ E ≥ 1. Also there is no need to assume that (M + E + 2) will be a multiple of 8.
Sample Input
5.699141892149156e76
9.205357638345294e18
0e0
Sample Output
5 8
8 6
基本是一道纯碎的数学题目
AC代码:
#include <iostream> #include <sstream> #include <string> #include <cmath> using namespace std; int main() { double M[20][40]; long long E[20][40]; // 打表 for (int i = 0; i <= 9; ++i) for (int j = 1; j <= 30; ++j) { double m = 1 - pow(2, -1 - i), e = pow(2, j) - 1; double t = log10(m) + e * log10(2); E[i][j] = t, M[i][j] = pow(10, t - E[i][j]); } // 输入并输出结果 string in; while (cin >> in && in != "0e0") { // 处理输入 for (string::iterator i = in.begin(); i != in.end(); ++i) if (*i == 'e') *i = ' '; istringstream ss(in); double A; int B; ss >> A >> B; while (A < 1) A *= 10, B -= 1; // 在打好的表中寻找答案 for (int i = 0; i <= 9; ++i) for (int j = 1; j <= 30; ++j) { if (B == E[i][j] && (fabs(A - M[i][j]) < 1e-4 || fabs(A / 10 - M[i][j]) < 1e-4)) { cout << i << ' ' << j << endl; break; } } } }