Lab 3-4: 精確科學記號比大小 (10%)
- 輸入:兩個以 10 為底的實數。
- 實數的正負號 (sign),正負號輸入大於等於 0 為正數,小於 0 為負數。
- 實數的尾數 (mantissa),尾數部分固定 19 位數字,第一位不為
0
,數值為輸入數字乘以\( \frac{1}{1,000,000,000,000,000,000} \),。 - 實數的指數部分 (exponent),指數部分為 -126 至 +127。
- 輸出:
- 兩實數的科學記號表示,有效位數 (Significant figures - Wikipedia) 顯示固定為 19 位。
- 兩實數比較結果,如果第一數較大則輸出
1
,相同則輸出0
,第一數較小則輸出-1
- 檔名:lab3_4_<學號>.cpp (e.g. lab3_4_106062802.cpp)
程式需提示使用者輸入兩個實數的正負號 (sign)、實數的尾數 (mantissa,輸入數字乘以\( \frac{1}{1,000,000,000,000,000,000} \))、實數的指數部分 (exponent),程式需輸出數字顯示比較結果。
Format
Input real number (a), sign: <sign a>⏎
Input real number (a), mantissa: <mantissa a>⏎
Input real number (a), exponent: <exponent a>⏎
Input real number (b), sign: <sign b>⏎
Input real number (b), mantissa: <mantissa b>⏎
Input real number (b), exponent: <exponent b>⏎
The real number (a) is: <output real number a>
The real number (b) is: <output real number b>
Compare result: <1, 0, or -1>
Example
$ ./a.out
Input real number (a), sign: -100⏎
Input real number (a), mantissa: 1234567890123456789⏎
Input real number (a), exponent: 10⏎
Input real number (b), sign: -10⏎
Input real number (b), mantissa: 1234567890123456788⏎
Input real number (b), exponent: 10⏎
The real number (a) is: -1.234567890123456789e+10
The real number (b) is: -1.234567890123456788e+10
Compare result: -1
Reference Code:
TA version: using unsigned long long
to store mantissa.
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a_sign, a_exp, b_sign, b_exp;
unsigned long long a_mantissa, b_mantissa;
cout << "Input real number (a), sign: ";
cin >> a_sign;
a_sign = (a_sign >= 0 ? 1 : -1);
cout << "Input real number (a), mantissa: ";
cin >> a_mantissa;
cout << "Input real number (a), exponent: ";
cin >> a_exp;
cout << "Input real number (b), sign: ";
cin >> b_sign;
b_sign = (b_sign >= 0 ? 1 : -1);
cout << "Input real number (b), mantissa: ";
cin >> b_mantissa;
cout << "Input real number (b), exponent: ";
cin >> b_exp;
// initialize
cout << "The real number (a) is: "
<< a_sign * (int)(a_mantissa / (long long)1e+18)
<< "."
<< setw(18) << setfill('0')
<< a_mantissa % (long long)1e+18
<< "e"
<< (a_exp >= 0 ? "+" : "-")
<< setw(2) << setfill('0')
<< (a_exp >= 0 ? a_exp : -a_exp)
<< endl;
cout << "The real number (b) is: "
<< b_sign * (int)(b_mantissa / (long long)1e+18)
<< "."
<< setw(18) << setfill('0')
<< b_mantissa % (long long)1e+18
<< "e"
<< (b_exp >= 0 ? "+" : "-")
<< setw(2) << setfill('0')
<< (b_exp >= 0 ? b_exp : -b_exp)
<< endl;
int result = (a_sign * b_sign == -1 ? (a_sign > b_sign ? 1 : -1) :
(a_exp > b_exp ? a_sign :
(a_exp < b_exp ? -a_sign :
(a_mantissa > b_mantissa ? a_sign :
(a_mantissa < b_mantissa ? -a_sign : 0)
)
)
)
);
cout << "Compare result: "
<< result
<< endl;
return 0;
}
Credit: 鄭楷庭 (110021119)
#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>
int main()
{
long long sign1, num1, sign2, num2;
std::string man1, man2;
signed int expo1, expo2;
int comp = 0, i;
std::cout << "Input real number (a), sign: ";
std::cin >> sign1;
std::cout << "Input real number (a), mantissa: ";
std::cin >> man1;
if (sign1 < 0)
{
man1.insert(0, "-");
man1.insert(2, ".");
}
else
{
man1.insert(1, ".");
}
std::cout << "Input real number (a), exponent: ";
std::cin >> expo1;
std::cout << "Input real number (b), sign: ";
std::cin >> sign2;
std::cout << "Input real number (b), mantissa: ";
std::cin >> man2;
if (sign2 < 0)
{
man2.insert(0, "-");
man2.insert(2, ".");
}
else
{
man2.insert(1, ".");
}
std::cout << "Input real number (b), exponent: ";
std::cin >> expo2;
std::cout << "The real number (a) is: " << man1 << "e" << std::showpos << expo1
<< std::noshowpos << std::endl;
std::cout << "The real number (b) is: " << man2 << "e" << std::showpos << expo2
<< std::noshowpos << std::endl;
if (sign1 >= 0 && sign2 < 0)
comp = 1;
else if (sign1 < 0 && sign2 >= 0)
comp = -1;
else
{
if (sign1 >= 0)
{
if (expo1 > expo2)
comp = 1;
else if (expo1 < expo2)
comp = -1;
else
{
for (i = 0; i < man1.length(); i++)
{
if (man1[i] > man2[i])
{
comp = 1;
break;
}
else if (man1[i] > man2[i])
{
comp = -1;
break;
}
}
}
}
else
{
if (expo1 > expo2)
comp = -1;
else if (expo1 < expo2)
comp = 1;
else
{
for (i = 0; i < man1.length(); i++)
{
if (man1[i] > man2[i])
{
comp = -1;
break;
}
else if (man1[i] > man2[i])
{
comp = 1;
break;
}
}
}
}
}
std::cout << "Compare result: " << comp << std::endl;
}