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;
}