• ベストアンサー

根号の中が負の時の計算機での正負判断は?

コンピュータで数値計算(言語はFortranやC)をする時、次のような場合はどう扱われるのでしょうか。 例1.sqrt(-4)の解は±2iの二つあるが、コンピュータではどうなる? 例2.a>b>0の時、sqrt(b-a)の解の正負符号はどうなる。 最初の値の符号に合わせられると聞いたことがあるが、本当ですか。もしそうならsqrt(b-a)=+・・・ 、sqrt(-a+b)=-・・・ となるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.3

言語依存. もっというと,同じ言語であっても ライブラリ依存でしょう. たとえば,Perlだと use strict; use warnings; use Math::Complex; print sqrt(-4); これでしっかり,2i と答えがでてくるけど, Math::Complexを使わないと当然エラー

pipiruru11
質問者

補足

No1,No2の方へ、まとめてお礼申し上げます。 以下の例題で簡単なプログラムをFORTRANでつくり、実際に試した結果を報告します。csqrtは複素数の平方根をとる組み込み関数です。 a=-6.0, b=2.0 x=csqrt(a+b), y=csqrt(b+a) , xおよびyの結果はどちらも2iでした。 結論として私の使っている環境では、数学的な解である±2iのうち、 正の2iがアウトプットされるようです。応用として、負の解が必要な場合があるので今回の質問をしましたが、その点は自分で判断基準を ソフトに入れる必要があるようです。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

No.1の者です。 計算不能と書いたのは、例えばC言語のsqrt関数に負数の引数を与えたときの話です。 複素数型の引数を許す関数(例えばcsqrt関数、実際にこういうのがあるかどうかはわかりません)を持つ処理系であれば、 -4の平方根として実部0、虚部±2iという結果を得ることができるでしょう。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

> 例1.sqrt(-4)の解は±2iの二つあるが、コンピュータではどうなる? 計算不能です。

関連するQ&A

  • 正負の数で最初の方わざわざ()を付けて計算させるのは、演算の+-と符号

    正負の数で最初の方わざわざ()を付けて計算させるのは、演算の+-と符号の+-を区別させる為ですか? ()の必要性が良く分かりません、5-(-5)の用に符号が重なった時のみ使えばいいと思うんですが、 参考書の問題で(-5)+4+(-7)-(-8)= というのがあったのですが、これって最初の-5にまで()を付ける必要はないですよね? 冒頭にマイナスが来てるわけだから、これは演算の-ではなく符号の-だと即座に判断出来るのに 何で()が付いてるのでしょうか?

  • 計算精度(限りなくゼロに近く)

    現在、fortranで大きな数値計算をしています。 そこで、計算回数が多く、その計算過程において大きい値と小さい値とを何回も計算していると誤差が次第に大きくなっていきます。 A=BとなるようにA(又はB)を求めるときの判別としてabs(A-B)<10**(x) としています。 このxに-300ぐらいの値をいれ判別したいのですがそれは可能ですか? もちろん計算には倍精度を使っていますがabs(A-B)が10**(-17)付近になると値が一定になってしまいます。これがfortranの限界なのでしょうか?

  • 情報学についての質問です。

    考えても理解できなかったので教えてもらえるとうれしいです。 問 配列A,Bに正負の符号と絶対値の十進数をアスキーコードで表された値が入力されている。正負は0の時'#'、負の時は'-'で表され、続いて絶対値が一桁10進数の文字表現として代入されている。 (a)符号と絶対値がそれぞれCL,ALレジスタに与えられているとき、その値を8ビット符号付き整数としてBLレジスタに入力するsubroutinABSのフローチャートと命令コードを書く。 (b)配列A、Bの値をそれぞれ8ビット符号付き整数に変えた後、それらの和をDLレジスタに求める命令を書く。(a)のsubroutinを使う。 (c)(b)でDLレジスタに求められた8ビット符号付き整数を正負の符号と絶対値をアスキーコードで表し下の配列Cに入れる。この処理のフローチャートと命令コード書く。 DL:1111 1111B   のとき、  C: '-'、'1'  とする。 詳しい解説とともに解答していただけるとありがたく思います。お願いします。

  • パソコンは本当に「電子計算機」?

    このカテゴリーでよろしいんでしょうか。 いまインターネットを通じて「ご質問」 させて頂いているわけですがパソコンを用いています。 このパソコンは本当に「電子計算機」なのでしょうか。 もしパーソナル・コンピューターならば 関数電卓のような「計算」や、FORTRANのような 言語で作動させられる「環境」あるいは「サイト」のよう なものがありますでしょうか。 要領の悪いご質問ですみません。

  • sinθ-cosθをrsin(θ+α)の形にする

    sinθ-cosθをrsin(θ+α)の形に変形する仕方について。 asinθ+bcosθ=rsin(θ+α) ただし、r=√(a^2+b^2) sinα=b/r , cosα=a/r という定義があるのは分かるのですがαの値の正負の判別のしかたがわかりません。 今回、定義に従って計算するとα=π/4となるのですが、答えには√2sin(θ-(π/4))とありました。 αの前にある符号はasinθ+bcosθはaとbの符号の組み合わせで決まるのでしょうか? 計算ミスの可能性もあります... 回答のほうよろしくお願いします。

  • C言語について

    コンピューターシミュレーション(数値計算)をするためにC言語を勉強することになりました。以前まではFORTRANで行っていたので、まったくC言語がわかりません。C言語の勉強を始めるにあたって、何か良い参考書または、ホームページとかあれば教えてください。

  • 2次方程式の解 Cプログラミング

    C言語でのプログラムの添削をお願いします。 2次方程式の解を求めるものなのですが。 #include<stdio.h> #include<math.h> main(){ double a,b,c,d; double x1=0; double x2=0; scanf("%lf %lf %lf" ,&a,&b,&c); printf("a=%f b=%f c=%f\n" ,a,b,c); d=b*b-4*a*c; if(d>0){ x1=(-b+sqrt(d))/2*a; x2=(-b-sqrt(d))/2*a; printf("x=%f,%f\n" ,x1,x2); }else if(d<0){ x1=-b/2*a; x2=sqrt(-d)/2*a; printf("x=%f+%fi,%f-%fi\n" ,x1,x2,x1,x2); }else{ printf("x=%f\n" ,x1); } return 0; } このとき、 a=-7,b=2,c=-1 を与えると x=7.000000+-17.146428i,7.000000--17.146428i という値が返ってきます。 他にも、虚数解のときに間違った値が返ってきてしまう気がするのですが、いかがでしょうか? 実数解のときは正しいようです。 回答よろしくお願いします。

  • 2次方程式の解の符号

    2次方程式の解の符号がわからないので質問します。 2次方程式2x^2-2(a-1)x+a^2-4a=0が実数解をもつとき、aの値の変化にともなって、解の符号はどのように変わるか。 解答は、D/4=(a-1)^2-2(a^2-4a)=-(a^2-6a-1)≧0、a^2-6a-1≦0から 3-√10≦a≦3+√10、このとき方程式は実数解α、β(α≦β)α+β=a-1,αβ=(1/2)a(a-4)であるから、α+β,αβの符号の変化を調べて、下記の表のようになりました。この表の解の符号がわかりません。aに3-√10などを代入し,計算しましたが、α=β<0などを導くことができません。どなたか解の符号とαとβの等しい、大小関係を教えてください。

  • 計算機で消費税の計算をした時の誤差について

    計算機で消費税の計算をした時の誤差について教えて下さい。 例)1000円の税込みの計算をするときに    1000+5%とすると1050と    正しく税込みの値が出てきます。   逆に 1050円から税抜きの計算をするときに      1000ー5%とすると 997.5という      値がでてきました。 なぜ 1000円という 元の値が出てこなくなってしまうのでしょうか? ちなみに ×1.05 / ÷1.05での計算方法は解っています。 宜しくお願いします。 

  • C++で二次方程式のプログラム

    大分前に二次方程式のプログラムを作るって問題が出ていました。 しかし、セットで作ったプログラムのフローチャートを書くんですがフローチャートが分かりません。 条件は 虚数解 a=0 実数解 の場合分けをして、解を出すってプログラムなんですが、多分、それ自体は合っていると思います。 しかし、そのフローチャートを書きなさいって問題があったんですが、それが未だに分からないんですが、これをフローチャートに書くとすると、どう書けばいいですか? #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c,d,x0,x1; cout << "aを入力してください\n"; cin >> a; cout << "bを入力してください\n"; cin >> b; cout << "cを入力してください\n"; cin >> c; d=b*b-4*a*c; x0 = (-b + sqrt(d)) / (2 * a); x1 = (-b - sqrt(d)) / (2 * a); if(a==0) { cout << "解は1つで" << -c/b << "です\n"; } else if(d>0) { cout << "解は二つの実数解で,解は" << x0 << "," << x1 << "です\n"; } else { cout << "解は二つの虚数解で,解は" << (-b) / (2 * a) << "+i" << sqrt(-d) / (2 * a) << " , " << (-b) / (2 * a) << "-i" << sqrt(-d) / (2 * a) << "です\n"; } return 0; }