• 締切済み

C言語のプログラムについて質問です。

C言語のプログラムについて質問です。 プログラムでどうしても2.2乗という少数のべき乗を使用しなければいけなくなったのですが、 POW関数では遅くて使い物になりません。 そこで、べき乗の高速化について調べたのですが、整数のべき乗の高速化しか出てきませんでした。 少数のべき乗の高速化アルゴリズムというものはあるのでしょうか?

noname#131042
noname#131042

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> 底になり得る値については、この計算を行う手前までわからないので、表引きは厳しいみたいです。 それはそうでしょうが、定義域にはまったく制限がないのでしょうか? f(x) = x^(1/2.2) のグラフを描けばわかりますが、0.0~1.0あたりでは比較的変化が大きく、xが大きくなればなるほど直線に近づきます。 それほど高い精度が必要ないのであれば、とびとびの値を表で持ち、その間は直線とみなして近似値を求めることはできるはずです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

環境不明の上、型もわからないので正確なことはいえませんが... 底になり得る値が限られているのであれば、表引きにしてしまうのもひとつの手です。

noname#131042
質問者

補足

まず、お詫びを。質問には2.2乗と書かせていただきましたが、実際には1/2.2乗でした。 すみません。 底になり得る値については、この計算を行う手前までわからないので、表引きは厳しいみたいです。 環境については、何を書けばいいのかわからないのですが、型としてはdouble型の値を1/2.2乗し、double型へ入れるような形となります。

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

念のためにおたずねします。 pow関数が遅すぎて使えないことがわかるくらい、 何回もべき乗を計算する必要がある、ということでしょうか? なお、今回の話題においては、少数ではなくて小数です。

noname#131042
質問者

補足

現在640×480の画像を取り扱ってまして、合計307200回計算を行わないといけないのです。 pow関数を使った計算では速度の面で使えないことがわかったので何か高速化できないかと思い、質問させていただきました。 後、たしかに少数でなく小数ですね。ご指摘ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

0.2乗ということは 5乗根だから, ニュートン法なりなんなりで方程式を解けばいい... ということになるんだけど, 実際問題としてこれで速いかどうかは知らん.

noname#131042
質問者

補足

すみません。質問では2.2乗と書かせていただきましたが、実際は1/2.2乗でした。 ニュートン法については調べてみたいと思います。

関連するQ&A

  • C言語の数学関数

    C言語の数学関数で、double型実数Xの平方根(1/2乗)は「sprt(X)」ですが1/3乗や1/4乗、1/n乗(n:実数)はどうやって表せばいいんですか? 「pow()関数」を用いればいいんですか? 例えば、 1.2の1/3乗は→pow(1.2 , 1.0/3.0) 1.2の1/4乗は→pow(1.2 , 1.0/4.0) 1.2の1/12.3は→pow(1.2 , 1.0/12.3) となるのですか? 宜しくお願いします。

  • 関数はあるがC言語で書けないプログラム

    数学的に関数はあるがC言語では書けないプログラムを 探しています。 関数自体は偶数か奇数(0以上の整数)を返す関数で しかしプログラムでは書けないというものです。 よろしくお願いします。

  • C言語

    毎度毎度お世話になります<(_ _)> 今回は関数のところで躓いています(;´Д`) 問題は二つなんですけど、 「二つの整数変数の引数の和を計算して結果を戻す関数plusを作成し、 それを利用して以下の実行結果になるようにしなさい。」 ■ 実行例 ■ Input two integer numbers 4 5 4+5=9 (数字は1例です) 「会場を求める関数factとべき乗を求める関数powintを利用して、 n!/xのn乗を求める関数pow_factを作成しなさい。 ただし、pow_fact関数は因数に整数値をとるが、戻り値は実数になることに注意しなさい。」 ■ 実行例 ■ Input number 5    1    1.000000000    2    0.500000000    3    0.222222224    4    0.093750000    5    0.038400002 ( 数字は1例です ) といった感じです。 最初の問題は int plus( int a, int b){ int y = 1; ココがわからない return y; } この先もわからない といった感じです。 二問目に関してはさっぱりわかってません(;´Д`) 回答、アドバイスなど沢山の回答お待ちしています。 ちなみにLinuxのGNOME端末をつかっています。

  • C言語のアルゴリズムについて

    C言語で「標準入力から英語の文章を読み込んで,文字列Ilmorが出現した行をその行番号とともに表示するプログラムを作りなさい.」とプログラムを作りたいのですが、文字列を発見するところまでは分かるのですが、その行どうやって表示すればいいのか分かりません。また、文章を読み込むのもすごくややこしく最後にエンターを二回押すなどの制限があります。(scanf) 参考になるプログラムを書いていただける方いませんか?できればC言語のアルゴリズムについて詳しく書いた本やサイトがあれば教えていただきたいです。 レベルは超入門的な本を2,3冊読んだ程度です。アルゴリズムなどにはまったく触れてなかったし、ライブラリー関数も少ししか載ってなかったので関数の本もあれば教えていただきたいです。

  • C言語のプログラムで...

    C言語のプログラムで2つのprintf関数の表示にタイムラグを付ける場合はどうしたら良いでしょうか?

  • 2次関数の最小値をC言語とGAを用いて求めたいです

    私は機会系の大学生のものです。 今回は 2次関数の最小値をプログラムのC言語と遺伝的アルゴリズム(GA)を用いて求めたいのですが 私がC言語が素人のためプログラムを作れません...。例として教えていただけると幸いです。 よろしくお願い致します。

  • C言語未経験者からの質問

    ゲームプログラムの専門学校に入ろうと思っているのですが C言語がまったくの未経験でして困っています。 そこで質問なのですが (1)C言語の入門書レベルの書籍(できれば特定の処理系に依存していないもの) (2)アルゴリズム関係のわかりやすい書籍 の2つを教えてください。 どうかよろしくお願いします。

  • C言語

    C言語のプログラムで『正の整数を読み込み、その整数より小さい3の倍数を全て表示するプログラムを作る』 これをどなたかプログラミングしてください。お願いします。

  • C++プログラムをCで呼び出したい

    こんにちは。質問させていただきます。 現在、Linux/GCC3.2.3系でC言語の開発をしています。 私自身のレベルとしては、C言語での実務は1年未満。C++はゼロ。本業はJavaプログラマを数年やっております。 さっそく本題です。 既にC++で作成されたある一連のプログラム群(20本程度)があり、これらC++の関数をC言語で作成されたプログラムから呼び出して使用したいと思っています。 C++プログラムは既にテスト済みなので、これらのソースは基本的には手を加えず、そのままライブラリ化などして使用したいと考えています。 そこで質問なのですが、C言語から呼び出せるような形式でC++ソースをライブラリ化する方法と、C言語からの呼び出し方を教えていただけないでしょうか?

  • 至急で、C言語の問題で解答解説お願いします。

    1実数を3つ(a,b,c)を読み込み3辺とする三角形ができるか判定(d(d-a)(d-b)(d-c)>0のとき三角形となる)しできなければ、三角形ではありません!というメッセージを表示し、できる場合は以下のヘロンの公式を用いて三角形の面積を求めるプログラムをC言語で答えてください。d=(a+b+c)/2 s=√{d(d-a)(d-b)(d-c) 2maxの整数値(≧1)をキーボードから入力し、その値に対応した図形を出力するプログラムをC言語で答えてください。 例 max1 max2 max3 * ** *** * ** *** * ** *** ** *** *** 3整数nをキーボード入力しnの値に応じて以下の図形を表示するプログラムをc言語で答えてください。 n=3 n=4 n=5 3 4 5 45 56 67 678 789 890 0123 1234 56789 4整数n(≧0)を入力し歯科の計算を実行するC言語プログラムを答えてください。2つの自然数nとmを読み込みn個の中からm個を取り出すときの組み合わせの数を計算せよ。ただし、n!を計算する関数long fact (int n)を定義し必ずそれを用いること。 5 1つのscanfで2つの10進数を入力し8進数と16進数で表示するプログラムをC言語で答えてください。 6 実数aを入力し少数第1位で四捨五入する関数g(a)をマクロ定義で入力した値の少数第1位を四捨五入して出力するプログラムをC言語で答えてください。 7 4つの実数w,x,y,zを読み込みその最大値を出力するプログラムをC言語で答えてください。ただし、2つの実数の大きいほうを求める関数 double my may (double x,double y)を定義し、その関数を用い、if文を用いないでc言語で答えてください。