3

C# で電卓をコーディングしています。

textBoxResult数字を表示するテキストボックスです

recount角度を度単位で受け取り、ラジアン単位で返す関数です。

から角度をとりますtexBoxInput

public double recount(int number)
{
    double wyjscie = 0.0;
    double Number = number;
    wyjscie = Number * (Math.PI / 180);
    return wyjscie;
}

//function which is called out when user presses the button:
textBoxResult.Text = Math.Round(Math.Tan(recount(Convert.ToInt32(texBoxInput.Text))),2).ToString();

ご覧のとおり、 を使用するときにこの数値を丸めようとしましMath.Tanたが、それでもMath.Tan90 度からの tan は 1,63317787283838E+16 です。

私は答えを見つけようとしてきましたが、失敗しました。正しい結果を表示する方法がわかりません。

4

3 に答える 3

3

基本的に、これは から期待される動作のようMath.Tanです。私は他の言語をよく知らないので、これが浮動小数点演算の通常の動作なのか、C# の実装に固有なのかはわかりません。(注: その後、Google のオンライン計算機が同じ結果を返すことがわかりました。これは、おそらくpiが無理数であるという事実と倍精度データ型の制限に関連して、浮動小数点三角関数の動作が予想されることを示唆しています)

ただし、この結果から逆方向に作業するMath.Atan(// your result);と、Math.Atan(double.PositiveInfinity)両方とも 90 度が返されます。これは予想されることでしょうか?

これが私のテストです:

var deg = 90.0;
var rads = deg * (Math.PI / 180);
var result = Math.Tan(rads);

if (Double.IsInfinity(result))
    Console.WriteLine("Tan of 90 degrees is Infinity");
else if (Double.IsNaN(result))
    Console.WriteLine("Tan of 90 degrees is Undefined");
else
    Console.WriteLine("Tan of 90 degrees is {0}", result);

Console.WriteLine("Arc Tan of {0} is {1} degrees", double.PositiveInfinity, Math.Atan(double.PositiveInfinity) * 180 / Math.PI);
Console.WriteLine("Arc Tan of {0} is {1} degrees", result, Math.Atan(result) * 180 / Math.PI);

次の出力が得られます。

Tan of 90 degrees is 1.63317787283838E+16
Arc Tan of Infinity is 90 degrees
Arc Tan of 1.63317787283838E+16 is 90 degrees

したがって、私の推測では、誰かが介入して回避策を提供できない限り、正しい結果を得るにはエッジ ケースとしてこれを回避するようにプログラムする必要があるかもしれません。

任意の三角関数の「正しい結果」は の精度 (double有効数字 15 桁) に制限されるため、それ以上の精度が必要な場合は、より正確な数学をサポートするライブラリを見つける必要があります。

望ましくない応答を提供しているように見えるのでMath.Tan(Math.PI/2)、次のようなことができます:

public double ComputeTangent(double angleRads)
{
    if (angleRads == Math.PI/2)
        return double.PositiveInfinity
    if (angleRads == - Math.PI/2)
        return double.NegativeInfinity

    return Math.Tan(angleRads);
}
于 2012-08-24T12:19:29.117 に答える
1

Round缶に書かれていることを正確に行っています:

返される整数と小数の最大合計数は 15 です。丸められた値が 15 桁を超える場合は、上位 15 桁が返されます。丸められた値に含まれる桁数が 15 桁以下の場合、整数桁と、digits パラメータで指定された数の小数桁が返されます。

1.63317787283838E+16は上位 15 桁で、小数部分はありません。

これを表示したい場合は、1,63E+016次を使用できます。

number.ToString('E2', CultureInfo.CreateSpecificCulture("fr-FR"))

,(または、小数点として使用するその他のロケール)

参照:指数 ("E") 形式指定子

于 2012-08-24T12:02:56.480 に答える
1
 using System;

namespace Lab_Ex_12
{
    class SimpleCalculator
    {
        double num1, num2;
        public void read()
        {
            Console.WriteLine("\n Enter any two numbers:");
            Console.Write("\n Number1 : ");
            num1 = double.Parse(Console.ReadLine());
            Console.Write("\n Number2 : ");
            num2 = double.Parse(Console.ReadLine());
        }
        public void add()
        {
            double sum = num1 + num2;
            Console.WriteLine("\n Result : ({0}) + ({1}) = {2}", num1, num2, sum);
        }
        public void subtract()
        {
            double diff = num1 - num2;
            Console.WriteLine("\n Result : ({0}) - ({1}) = {2}", num1, num2, diff);
        }
        public void multiply()
        {
            double prod = num1 * num2;
            Console.WriteLine("\n Result : ({0}) X ({1}) = {2}", num1, num2, prod);
        }
        public void divide()
        {
            double qt = num1 / num2;
            Console.WriteLine("\n Result : ({0}) / ({1}) = {2}", num1, num2, qt);
        }
    }
    class ArithmeticOperations
    {
        public static void Main()
        {
            SimpleCalculator SC = new SimpleCalculator();
            int ch, i=1;
            while(i==1)
            {
                Console.Clear();
                Console.WriteLine("\n *************************");
                Console.WriteLine("\n   ZAHID SIMPLE CALCULATOR.");
                Console.WriteLine("\n *************************");
                Console.WriteLine("\n 1-----> ADDITION");
                Console.WriteLine("\n 2-----> SUBTRACTION");
                Console.WriteLine("\n 3-----> MULTIPLICATION");
                Console.WriteLine("\n 4-----> DIVISION");
                Console.WriteLine("\n 5-----> EXIT");
                Console.WriteLine("\n *************************");
                Console.Write("\n\n Enter your choice: ");
                ch = int.Parse(Console.ReadLine());
                switch (ch)
                {
                    case 1: SC.read();
                            SC.add();
                            break;
                    case 2: SC.read();
                            SC.subtract();
                            break;
                    case 3: SC.read();
                            SC.multiply();
                            break;
                    case 4: SC.read();
                            SC.divide();
                            break;
                    case 5: Environment.Exit(-1);
                            break;
                    default: Console.WriteLine(" Sorry !!! Wrong  choice.");
                            break;
                }
                Console.Write("\n Press ENTER to Continue. ");
                Console.ReadLine();
            }
            Console.WriteLine("\n Cannot continue... Bye");
        }
    }
}
于 2015-03-02T02:54:08.660 に答える