x^0.5  をやりたいのですが ^が実施できないコンパイラを使っています。
x^3 なら x*x*xとすればいいのですが ^0.5の近似式を教えて
欲しいのですが・・

このQ&Aに関連する最新のQ&A

A 回答 (4件)

√x = x^0.5 は言語によってはsqrt(x), sqr(x), power(x,0.5) などと書かれます。



そういうのがない場合には、数値計算をする関数(functionあるいはprocedure, subroutine, method)を作ってやれば良いですね。 要するに、大抵の言語でコンパイラに作りつけの関数sqrtがやっていることを自分で書けばよい。

~~~~~~~~~~~~~~~~~~~~~

√xを高い精度で計算するには、漸化式を使うのが速いと思います。

もちろんx<0のときはエラー、x=0なら√x=0です。
x>0のとき、y=√x に近づく近似値の列y[0], y[1], ...., y[k], .... を次々と作り、誤差が小さくなったら終わります。

●漸化式
適当な出発値y[0]から始めて
y[n+1]=y[n]/2+x/(2y[n])
という漸化式でy[1], y[2], ... を作ります。(Newton法)
この式は、繰り返しの度に有効桁数が倍になる、「2次収束」という性質を持っているので、出発値y[0]が正解に近ければ、ほんの数回の繰り返しで十分な精度(10進法で10桁以上)に達します。

●繰り返しを何処で打ち切るかの判断
 筋から言うと、正解√xに対する相対誤差 δ
δ=|(y[n]^2)/x - 1|/2
が十分小さくなったら打ち切る、ということで良いでしょう。
 このδがなぜ相対誤差なのか。近似値y[n]が絶対誤差εを含んでいて
y[n]=sqrt(x)+ε
であるとすると、
δ=|(y[n]^2)/x - 1|/2
= |(x+2y[n]ε+(ε^2))/x - 1|/2
= |(2ε√x+ε^2)/x |/2
≒|(2ε√x)/x |/2   (|ε|は小さいのでε^2 は無視できる。)
= |(ε/√x |
だからです。
 幾らなら十分小さくなったと言えるか。これは要求される精度に依存しますが、一般に計算機内部での浮動小数点数値の有効桁数を超えたら、それ以上計算したってしょうがないですね。
 これを逆手に取って、
  y[n]とy[n+1]が同じになったら打ち切る
というやり方もあります。

●出発値y[0]
出発値y[0]があまりにもでたらめだと、上記の漸化式が旨く働かないことがあります。
 y[0]は、数値xの計算機内部での表現を利用すると簡単に決められます。
浮動小数点の数値xは符号部S、仮数部D、指数部Eで表され、たいてい16進法で
x = S×D×(16^E)
となっている。Eは整数です。
ここで、x≠0の場合には
1>D≧1/16
です。
 この問題ではx≠0だし、符号部SはS=1に決まっています。従って
√x = √D ×(4^E)
ですね。
√D=√(1+(D-1))≒1+(D-1)/2 ≒1
と荒っぽい近似ができます。また
Eが偶数の場合には
√x = √D ×16^(E/2)
Eが奇数の場合には
√x = (√D )/4 ×16^((E+1)/2)
です。

だから
  Eが偶数のとき y[0] = 符号部1 仮数部(1+(D-1)/2) 指数部(E/2)
  Eが奇数のとき y[0] = 符号部1 仮数部(1+(D-1)/2)/4 指数部((E+1)/2)
とでもすれば良いでしょう。もっと手抜きして
  Eが偶数のとき y[0] = 符号部1 仮数部1 指数部(E/2)
  Eが奇数のとき y[0] = 符号部1 仮数部1 指数部((E+1)/2)
でも大丈夫です。(漸化式の繰り返しが少し増えるだけです。)

内部表現の調べかたが分からない場合には、計算でDとEを出すこともできます。
 16^(E-1) < x < 16^(E)
となるEを見つければ良いのです。
    • good
    • 0
この回答へのお礼

ごていねいに ありがとうございました。
結局、sqrt関数を手作りでつくることにしました。

お礼日時:2001/10/02 23:02

sight さんが仰るように何か関数があるような気はしますが、


どうしても近似が必要であれば次のテイラー展開の結果を使ってください。

 (1+x)^α = 1 + (α,1)*x + (α,2)*x^2 + … + (α,n)*x^n + o(x^n)

ここで、(α,n) は2項係数でαは自然数でなくてもよいですが n は自然数です。
(通常カッコの中のαと n は縦に並べて書きますが今は横に並べています。)
つまり、

 (α,n) = α(α-1)…(α-n+1)/n!

です。ただし、(α,0)=1 です。
今は、α=1/2 ですから
 (1/2,1) = (1/2)/1! = 1/2
 (1/2,2) = (1/2)(1/2-1)/2! = -1/8
 (1/2,3) = (1/2)(1/2-1)(1/2-2)/3! = 1/16
などになります。
したがって、

 (1+x)^0.5 = 1 + x/2 - x^2 /8 + x^3 /16 …

と展開できます。ご質問の x^0.5 であれば、x+1 ⇒ x とずらして

 x^0.5 = 1 + (x-1)/2 - (x-1)^2 /8 + (x-1)^3 /16 …

ですね。
あとは近似の精度に気をつけて下さい。
    • good
    • 0

コンパイラ・・・プログラムですか?


^が使えなくても、Cのpow関数みたいに、べき剰を計算してくれる関数はないんでしょうか?
pow(x, 0.5)みたいにかけるような・・・・
    • good
    • 0

.5乗だけでよいなら


ルートを使ってください。

また

参考で色々書いていますよ

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=144106
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qx*y=log(e^x+e^y)と定義すると、(x*y)+z=(x+z)*(y+z)

x、y∈Rに対して
x*y=log(e^x+e^y)
と定義すると、
(x*y)+z=(x+z)*(y+z)
が成り立ちます。
分配法則の*と+を逆にしたような感じですが、この*から何かしらの代数的な事実が従うのでしょうか?
この*の意味は何なのでしょうか?

x*x=aのとき、x=√aと定めと、
√(a*b)≧(a+b)/2
といった相加相乗平均の関係の類似は成り立つようですが。

Aベストアンサー

e^x=X, e^y=Y, e^z=Z と置いて考えましょう。
e^(x*y)=e^x+e^y → Z=X+Y
e^(x+y)=e^x*e^y → Z=X*Y
つまり、正の数の加算と乗算になります。

>分配法則の*と+を逆にしたような感じですが

まさにその通りです。入れ替えて見てください。

>√(a*b)≧(a+b)/2

通常の相加相乗平均とは逆ですね。

Qx^x^x^x^x^x^・・・・・^x  の一般的な表し方

タイトル通りになってしまいますが、

x^x^x^x^x^x^・・・・・・^x (xはn個ある)

を一般的に表すことができる式というのはあるものなのでしょうか?

grapesで
y=x
y=x^x
y=x^x^x
y=x^x^x^x
 ・
 ・
 ・

のグラフを描いてみましたところ、どうやらnが偶数か奇数かによって2種類のグラフに近づいているように見えたのです。どなたか一般的な記述の仕方をご存知の方、宜しくお願いしますm(_ _)m

Aベストアンサー

x^x^xはx^(x^x)と表すべきです。同様にx^x^x^xではなく、x^(x^(x^x))です。
これは(x^x)^xとx^(x^x)が等しくないから区別する必要があるわけです。
たとえば(3^3)^3=729なのに対し、3^(3^3)=19683です。
一般に後者の方が圧倒的に大きくなります。

さて、話をx^(x^(x^(…)))に戻しましょう。
これは定義域を[0,1]に限れば、確かにおっしゃるとおり偶数と奇数で
関数の形状が分かれます。これはx^x→1(x→0)が関係しています。
x^(x^x)は不定形の極限ではなく、単に0^1=0に収束します。
偶数個のときは不定形の極限が現れるわけです。
数学的帰納法とたとえばlogを取って極限計算をされてみたらよいでしょう。

さて問題になっている、x^(x^x)などの表記ですが、
これにはクヌースのタワー表記(1976)というものが知られています。
たとえば
x^(x^x)=x↑↑3
x^(x^(x^(x^(x^x))))=x↑↑6
などと表示します。参考URL(wiki)などをごらんください。
wikiによるとx^^3や、x^^6などとも表示するようです。

参考URL:http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%8C%E3%83%BC%E3%82%B9%E3%81%AE%E7%9F%A2%E5%8D%B0%E8%A1%A8%E8%A8%98

x^x^xはx^(x^x)と表すべきです。同様にx^x^x^xではなく、x^(x^(x^x))です。
これは(x^x)^xとx^(x^x)が等しくないから区別する必要があるわけです。
たとえば(3^3)^3=729なのに対し、3^(3^3)=19683です。
一般に後者の方が圧倒的に大きくなります。

さて、話をx^(x^(x^(…)))に戻しましょう。
これは定義域を[0,1]に限れば、確かにおっしゃるとおり偶数と奇数で
関数の形状が分かれます。これはx^x→1(x→0)が関係しています。
x^(x^x)は不定形の極限ではなく、単に0^1=0に収束します。
偶数個のときは不定...続きを読む

Q数学の因数分解です。⑴ x^4-18x^2y^2+y^4⑵ x^4+4y^4です。途中式

数学の因数分解です。

⑴ x^4-18x^2y^2+y^4

⑵ x^4+4y^4

です。途中式も書いていただきたいです。
よろしくお願いします。

Aベストアンサー

⑴ x^4-18x^2y^2+y^4
x⁴-18x²y²+y⁴
=(x⁴-2x²y²+y⁴)-16x²y²
=(x²-y²)²-(4xy)²
={(x²-y²)+4xy}・{(x²-y²)-4xy}
=(x²-y²+4xy)(x²-y²-4xy)

⑵ x^4+4y^4
=x^4+4y^4+4x^2y^2ー4x^2y^2
=(x^4+4x^2y^2+4y^4)ー4x^2y^2
=(x^2+2y^2)^2ー4x^2y^2

a^2ーb^2=(a+b)(aーb)を利用して
=(x^2+2y^2+2xy)(x^2+2y^2ー2xy)

Qy=x^(x^(x^(x^(x^(x^…の定義域は

y=x^(x^(x^(x^(x^(x^…の定義域は
[e^-e,e^(1/e)]と書かれていた本を昔読んだことがあります。
(うろ覚えですが)

最大値がe^(1/e)であることは容易に示すことができたのですが、
最小値がe^-eであることはどうやって示せばよいのでしょうか。

ご存じの方がおられましたらご教授いただきたく、よろしくお願いいたします。

Aベストアンサー

y=x^(x^(x^(x^(x^(x^…^(x^x)…)))))≡x^^x (0<x) (xは無限に並ぶ)…(A)
この関数で注意しなければならないことは
---------------------------------------------------------------
y=x^(x^(x^(x^(x^(x^…^(x^x)…)))))) (0<x) (xはn個並ぶ)…(B)
x→0の時 y→0or1となること

0^0^…^(0^0)=1 (0が偶数個並ぶとき)
0^0^…^(0^0)=0 (0が奇数個並ぶとき)
からx<<1のとき
(B)は多価関数となると推察される。
しかも xの数の偶数、奇数で関数が分かれる。
---------------------------------------------------------------
したがって(A)を考えるとき、偶数個のxを固まりにして考えないと上の性質を表現できない。
なので
(A)式の右辺をyで置換する場合
y=x^(x^(y)) (0<x≦e^(1/e))…(C)
とすることで(B)式のxの数の偶数、奇数の場合の性質を含ませることが出来る。
この(C)の関数は0≦x≦e^(-e)で多価関数になるので,この変域を除けば
定義域は次のようになる。
e^(-e)≦x≦e^(1/e)
この定義域でyの値域は
1/e≦y≦e
となります。

(C)のグラフを添付しておきます。

定義域の最小値はグラフからもわかりますが、(C)の関数式が多価関数にならない下限値
(y=1/eの時のx)として求めることが出来ます。

y=x^(x^(x^(x^(x^(x^…^(x^x)…)))))≡x^^x (0<x) (xは無限に並ぶ)…(A)
この関数で注意しなければならないことは
---------------------------------------------------------------
y=x^(x^(x^(x^(x^(x^…^(x^x)…)))))) (0<x) (xはn個並ぶ)…(B)
x→0の時 y→0or1となること

0^0^…^(0^0)=1 (0が偶数個並ぶとき)
0^0^…^(0^0)=0 (0が奇数個並ぶとき)
からx<<1のとき
(B)は多価関数となると推察される。
しかも xの数の偶数、奇数で関数が分かれる。
---------------------------------------------------------------...続きを読む

Qcos(x/2)*cos(x/2^2)*・・・・・cos(x/2^n)

実数x及び自然数nに対して
a_n=cos(x/2)*cos(x/2^2)*・・・・・cos(x/2^n)
とする。
(1)2^n*a_n*sin(x/2^n)の値はnと無関係に一定であることを証明せよ。
(2)log|a_n|をxで微分することにより、
Σ(n=2~∞)1/2^n *tan(π/2^n)=1/π
であることを証明せよ

この問題に取り組んでいます。
(1)で2^n*a_n*sin(x/2^n)の計算を行っていて、いろいろな三角関数の公式を利用してみたのですが全然うまくいきません。「nと無関係」ということはnが消えればいいということだと思うのですが・・・。
(2)はloga_nを微分したところ
-1/2 tan(x/2) - 1/2^2 tan(x/2^2) -・・・となったのですがここから証明すべき式に変形するにはどうしたらいいのでしょうか?
回答いただければありがたいです。よろしくお願いします

Aベストアンサー

はじめまして。

(1)は倍角の公式(sin(2x) = 2*sin(x)*cos(x))を使うとおもしろいようにcos(x/2^n)が消えていきますよ。


人気Q&Aランキング

おすすめ情報