Help us understand the problem. What is going on with this article?

C#で外部ライブラリに頼らず三平方の定理(ピタゴラスの定理)を計算してみた

前置き

「もっと良い求め方ありますよ!」
「もっと良いソースありますよ!」
といったご指摘もあるかと思います。
当記事はあくまで「正しい答えをプログラミングで導く」ことを目的としたものです。
どうか、暖かな目でご覧いただけますと幸いです。

本題

三平方の定理とは...

image.png

画像のような直角三角形において、

\begin{equation}a^2+b^2=c^2\end{equation}

が成り立つというものです。

これを、C#でMathクラスに頼って実装すると...

//c = a^2 + b^2 である.
c = Math.Sqrt(Math.Pow(a, 2) + Math.Pow(b, 2));

上記のように、簡単に実装することができます。
PowPowerのことで、ある値の累乗を求める関数です。
今回の場合、変数a,bの2乗を求めています。
そして、SqrtSquare root(平方根)のことで、ある数の平方根を求めます。

これらの必要な処理を独自で実装してみます。

Power関数

//<summary>
//ある値の累乗を求める関数
//<param name="v1">求めたい値</param>
//<param name="accuracy">指定する累乗</param>
//</summary>
public static double Power(double v1, Int32 v2)
{
    if (v2 < 1) return 0;

    Int32 counter;
    double result = 1;
    Boolean isNegative = v2 < 0;

    //変数が負の値であることも想定
    //nn = v2 < 0 ? (-1) * v2 : v2;と同上
    if (isNegative)
    {
        counter = (-1) * v2;
    }
    else
    {
        counter = v2;
    }


    for (Int32 j = 0; j < counter; j++)
    {
        result *= v1;
    }

    if (isNegative)
    {
        result = (1 / result);
    }

    return result;
}

SquareRoot関数

//<summary>
//平方根を求める関数
//<param name="v1">平方根を求めたい値</param>
//<param name="accuracy">精度。9~10が正確。初期値10</param>
//</summary>
public static double SquareRoot(double v1, Int32 accuracy = 10)
{
    if (accuracy < 1) return 0;

    double result = v1;
    for(int x = 0; x < accuracy; x++)
    {
        //result = (result + v1 / result) / 2.0 と同上
        var n1 = v1 / result;
        var n2 = result + n1;
        result = n2 / 2.0;
    }
    return result;
}

実行結果

確認用として、本家のものと比較してみました。

ソースコード:

Program.cs
using System;

namespace MathSqrt
{
    class MainClass
    {
        //a^2 + b^2 = c^2
        static double a = 12;
        static double b = 5;
        static double c = 0;

        public static void Main(string[] args)
        {
            Console.WriteLine("Hello Math!");

            var na = MyMath.Power(a, 2);
            var nb = MyMath.Power(b, 2);
            c = MyMath.SquareRoot(na+nb);

            Console.WriteLine("三平方の定理(本家Math): {0}", Math.Sqrt(Math.Pow(a, 2) + Math.Pow(b, 2)));
            Console.WriteLine("三平方の定理(自作Math): {0}", c);

            Console.ReadKey();
        }
    }
}

image.png

最後に

最後までご覧いただきありがとうございました。
誤字脱字/間違い等ございましたら、コメントにてご指摘いただけますと幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした