外出自粛中でも楽しく過ごす!QAまとめ>>

組み込み系で開発しているものです。
どうしても 実数のべき乗 を使わねばならないのですが、
powf があまりに遅くて話になりません。

条件
・sinf, cosf は使ってもよい(高速なライブラリがあるので)
・指数は符号なし整数のみ(0~10000)
・底は 0.0~1.0 のみ
・戻り値も 0.0~1.0 のみ
・精度は 16bit 位で十分
・計算しておいてテーブルから呼んでもよい

自作で powf を作りたいのですが、
3時間いろいろやってみてもうまくいきませんでした。
他のやり方は無いでしょうか?

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

A 回答 (11件中1~10件)

> 対象ハードは ADSP-BF539 です。



そのプロセッサはFPUがなかったのでは?
そうであれば、主に時間が掛かっているのは浮動小数点演算の部分かと思います(ソフトエミュレーションなので)。

というわけで、#2さんのアルゴリズムで、固定小数点演算を行えばかなり改善するはずです。
固定小数点演算は、加算はそのままで構いませんし、乗算は16ビット×16ビットで計算してから、適当に丸めて16ビット右シフトすればOKです。精度を上げるには、途中の計算を16ビットではなく20ビットにしてもよいでしょう(40ビット整数型が使えるはずなので)。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>乗算は16ビット×16ビットで計算してから、適当に丸めて16ビット右シフト
asuncion さんの解法と組み合わせると、
powf の 12~13倍 は早くなりました。
精度は小数第4位くらいまでなら大体あっています。

まだ高速化できるでしょうか?

// 0.0~1.0 を 0~65536 として計算する。
unsigned int powf2(unsigned int f, unsigned short n)
{
  unsigned int ret=65536;

  if(f==0) return 0;
  if(n==0) return 65536;
  if(n==1) return f;

  for(;n;n>>=1)
  {
    if(n & 1)
    {
      ret *= f;
      ret >>=16;
    }
    f *= f;
    f >>= 16;
  }

  return ret;
}

お礼日時:2008/11/22 22:46

> ちなみに inline をつけたら 562 に若干増えました???



命令キャッシュが小さいからでしょう。
また、データキャッシュのサイズを考えると、表引きが有効とは思えません。

最適化オプションをどうしているのか分かりませんが、速度を最適化するより、サイズを最適化する方が結果的に高速になる可能性があります。また、案外register指定子が効くことがありますので、これも試してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

register ですが、効果がありませんでした。
(シミュレータで擬似的に動かしているからかもしれません)

最後に。結果として powf より 12倍以上早く計算できました。
開発は現在の方針で進めようと思っています。
長々とお付き合いありがとうございました。

お礼日時:2008/11/24 17:25

> まだ高速化できるでしょうか?



微々たるものでしょうが、nの型をunsigned shortではなくunsigned intにしてはどうでしょうか?
汎整数拡張によるオーバーヘッドがそれなりにありそうです。
あとは、for文ではなくdo文で書き直すとわずかに速くなります。

それ以上はアセンブリ言語に踏み込まないと難しそうです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>unsigned shortではなくunsigned int
消費サイクル数が 584 から 568 になりました。

>for文ではなくdo文で書き直す
消費サイクル数が 584 から 571 になりました。

2つを組み合わせて 584 から 555 になりました。
約 5% の高速化です。

ちなみに inline をつけたら 562 に若干増えました???

お礼日時:2008/11/23 18:37

>例えば 32768 位のテーブルを作ります。


>0.999 を底に、指数 0~32767 まで計算しておきます。
>このテーブルを元に、底と指数からテーブルのインデックスを決めて取り出す、
>ということは可能でしょうか?
>(散々計算しましたが、インデックスの位置の決め方が分からず、断念しました)

テーブルを使用する場合の例です。
実際に実装する場合は、init関数を使用せずに、
constでテーブルを定義しておくとよいです。
----------------------------------------------------------------------
#include <stdio.h>
#include <math.h>

#define MYPOWF_TABLE_SIZE 32768

double g_mypowf_table999[MYPOWF_TABLE_SIZE];

void init_mypowf_table999()
{
  int y;
  
  for (y = 0; y < MYPOWF_TABLE_SIZE; y++)
  {
    g_mypowf_table999[y] = powf(0.999, y);
  }
}

double select_my_powf_table999(int y)
{
  return g_mypowf_table999[y];
}

int main(int argc, char *argv[])
{
  double z;
  int y;
  
  /* テーブルを初期化 */
  init_mypowf_table999();
  
  for (y = 0; y < 10; y++)
  {
    /* y:指数 */
    z = select_my_powf_table999(y);
    printf("select_my_powf_table999(%d){%.15lf}\n", y, z);
  }
  
  return 0;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

select_my_powf_table999 ですが、
この関数に引数として 底、指数 を持たせて、
0.999 以外の底のべき乗を返すことはできないでしょうか?
(つまり、0.999 のテーブルから 0.999 以外の底の値を取得したいのです)

お礼日時:2008/11/23 18:12

>・計算しておいてテーブルから呼んでもよい


テーブルを使用する場合、
必要になるテーブル領域を単純に計算すると、
精度は16bit×0x4000×10000=327,680,000バイト
となりますから、
>ROM/RAM あわせて100KBくらいまで使えます。
の方法では、少し無理がありそうです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

例えば 32768 位のテーブルを作ります。
0.999 を底に、指数 0~32767 まで計算しておきます。
このテーブルを元に、底と指数からテーブルのインデックスを決めて取り出す、
ということは可能でしょうか?
(散々計算しましたが、インデックスの位置の決め方が分からず、断念しました)

お礼日時:2008/11/22 23:20

>#3さん


>(2)方法その2
>底や、指数の範囲も決まっているみたいですので、
>固定小数点で計算してから、浮動小数点に変換する方法も、よさそうですね。

>・底は 0.0~1.0 のみ
という情報だけからは、底(の範囲)が決まっているとは言えなそうです。
きざみ幅などの情報がないからです。
0.9の場合があるかもしれませんし、0.99999999の場合があるかもしれません。
小数点以下の桁数がもっと多い場合のことも考える必要があるのかもしれません。

よって、固定小数点で計算するのはむずかしそうです。
範囲が決められないからです。
    • good
    • 0
この回答へのお礼

きざみ幅などの情報がないからです。
>ご指摘ありがとうございます。

刻み幅ですが、0.0~1.0 と書きましたが実際には
渡されるのは符号なし整数で 0x0000~0x4000 が範囲になります。
0x0000 を 0.0、0x4000 を 1.0 に直してから計算しています。

なので刻み幅は 1.0 / 0x4000 = 0.00006103515625 です。

お礼日時:2008/11/22 16:54

#1です。



先ほどの補足要求の際に一緒にたずねるべきでしたが、まずはCPUとコンパイラを明確にしてください。メモリサイズに関する情報も必須です。
FPUの有無によっても、当然どうすべきかが変わってきます。
    • good
    • 0
この回答へのお礼

コンパイラは VisualDSP4.5 です。

対象ハードは ADSP-BF539 です。
http://www.analog.com/jp/embedded-processing-dsp …
ROM/RAM あわせて100KBくらいまで使えます。

現在は設計段階で、冶具もないために
VisualDSPのシミュレータでサイクル数を比較しています。
最終目標は作ろうとしているモジュールの MIPS の概算を出して、
ソフトウェアとして破綻しないことを提示することです。
(現在サイクル数からMIPSを計算しています。あくまで概算なので)

お礼日時:2008/11/22 17:10

どれくらい性能がよいかはわかりません。



#include <stdio.h>

double mypowf(double a, int n)
{
double p;

if (a == 0.0) return 0.0;
if (a == 1.0) return 1.0;
if (n == 1) return a;
for (p = 1; n; n /= 2) {
if (n & 1) {
p *= a;
}
a *= a;
}
return p;
}

int main(void)
{
int i;

for (i = 0; i < 33; ++i) {
printf("%.15f\n", mypowf(.5, i));
}
return 0;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
powf より2倍早いです。

お礼日時:2008/11/22 15:51

(1)方法その1


>・計算しておいてテーブルから呼んでもよい
とあるので、そのように実装してみては、如何でしょう。
速度的には速くなると思いますよ。

(2)方法その2
底や、指数の範囲も決まっているみたいですので、
固定小数点で計算してから、浮動小数点に変換する方法も、よさそうですね。
こちらの方法だと、(1)よりは若干遅くなりますが、消費メモリを大幅に
抑えられそうです。
    • good
    • 0
この回答へのお礼

一番早いのは多分テーブルから呼び出すことだと思いますが、
テーブルのどこから持ってくればいいのかがわかりません。

実際に表を組んで見ました。
底 0.95 で大体1になるのが 150乗 として テーブルサイズ 150 で、
あらかじめ表を作ってみました。
指数をインデックスとして、底 0.95、指数 35 が渡された場合、
テーブルの 35 番目を返します。

では、底 0.837、指数 23 だった場合、
どのインデックスを参照するればよいのでしょうか?

お礼日時:2008/11/22 16:45

>・指数は符号なし整数のみ(0~10000)



この条件から、「指数の回数」だけ掛け算を繰り返すのがベースになろうかと思います。
ただし、単純に繰り返すのではなく、例えば指数が16ならば
(((底の2乗)の2乗)の2乗)の2乗
とすることで、掛け算の回数を減らすことができます。
この考え方を拡張して、指数が2のべき乗(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192)の
場合を記憶しておきます。
そして、1~10000の指数(0乗は自明なので省略)を2のべき乗数の和で表わすと、
劇的とはいかないかもしれませんが、単純なループで掛け算を繰り返すよりは
いくぶんかでも効率がよくなるかもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
組んでみましたが、powf より2倍は早い結果を得られました。

お礼日時:2008/11/22 15:46

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QC言語で-23乗を取り扱うには

C言語でボルツマン定数

1.38*10^(-23)

を取り扱いたいと思っています。

k = 1.38/pow(10, 23);
あるいは
k = 1.38/100000000000000000000000;

としても、コンパイルはできますが実行したときに
『1.#INF00』
という表示(マイナス無限大?)が出てしまいます。

このようにとても小さな定数をC言語で扱う場合、
どのようにすればよいのでしょうか?

よろしくお願いします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
double k = 1.38e-23;

printf("ボルツマン定数K=%e\n", k);
return 0;
}

Q2の累乗を計算するプログラムを作ったのですが・・・

C言語を用いて、2の累乗(2,4,8,16・・・)を
計算して表示するプログラムを

#include<stdio.h>
void main(void)
{
int i,s;
s=1;
for(i=1; i<=15; i++)
{
s=s*2;
printf("i=%2d s=%7d\n",s);
}
}

と打ち込んで実行したのですが、結果が

i= 1 s= 2
i= 2 s= 4
i= 3 s= 8
i= 4 s= 16
i= 5 s= 32
i= 6 s= 64
i= 7 s= 128
i= 8 s= 256
i= 9 s= 512
i=10 s= 1024
i=11 s= 2048
i=12 s= 4096
i=13 s= 8192
i=14 s= 16384
i=15 s= -32768

のように、2の15乗だけが負になってしまいました。
最初のintをdoubleやfloatに直して実行すればよいのかとも考えたのですが、
実行すると答えがすべて0になってしまい上手くいきませんでした。
どの部分がおかしいのでしょうか・・・;

C言語を用いて、2の累乗(2,4,8,16・・・)を
計算して表示するプログラムを

#include<stdio.h>
void main(void)
{
int i,s;
s=1;
for(i=1; i<=15; i++)
{
s=s*2;
printf("i=%2d s=%7d\n",s);
}
}

と打ち込んで実行したのですが、結果が

i= 1 s= 2
i= 2 s= 4
i= 3 s= 8
i= 4 s= 16
i= 5 s= 32
i= 6 s= 64
i= 7 s= 128
i= 8 s= 256
i= 9 s= 512
i=10 s= 1024
i=11 s= 2048
i=12 s= 4096
i=13 s= 8192
i=14 s= 16384
i=1...続きを読む

Aベストアンサー

No2です。

追記ですが、printfの変換指定子は型にあわせたものを使わなければ正しく表示されません。
long であれば %ld にしてください。

参考URL:http://ja.wikipedia.org/wiki/Printf

QC言語 累乗の計算

プログラミングの課題が出たのですが
どうしても解けない問題が2問あったのでここで質問させてもらいます。

尚、私が書けた範囲で書いているので
根本的な間違えがありましたらご指摘ください。


「□」の部分がわかりません。

(1)任意の整数nを入力して4^nを計算するプログラミングを完成させよ

#include <stdio.h>
main(){
int i,n,x;
i=1;x=1;
printf("n=");
schanf("%d",&n);
while(i<=□){
        x=4*□;
i++;
}
printf("Answer=%d\n",x);
}



(2)e^xをテーラー展開したときのx^nの項の係数を求めるプログラミングを書け。

#include <stdio.h>
main(){
int i,n;
float x;
printf("Input Nunber");
scanf("%d",&n);

x=0

for(i=1;i<=n;i++){
x=□*x;
}
x=1/□;
purintf("Answer%f\n",x);
}




回答をお待ちしております。

プログラミングの課題が出たのですが
どうしても解けない問題が2問あったのでここで質問させてもらいます。

尚、私が書けた範囲で書いているので
根本的な間違えがありましたらご指摘ください。


「□」の部分がわかりません。

(1)任意の整数nを入力して4^nを計算するプログラミングを完成させよ

#include <stdio.h>
main(){
int i,n,x;
i=1;x=1;
printf("n=");
schanf("%d",&n);
while(i<=□){
        x=4*□;
i++;
}
pri...続きを読む

Aベストアンサー

No.2およびNo.3のTort_Capaです。


>累乗をどのように表せばいいのでしょうか?

 printf()関数で出力する部分のことでしょうか?
 printf()関数では計算した結果の値を出力します。たとえば、(1)では、整数nに3を入力して4^3を計算する場合は、printf()関数で
  Answer=64
と出力されます。

 (2)の
  purintf("Answer%f\n",x);
というのは、
  printf("Answer%f\n",x);
でないとエラーが出ますね。
 書式を(1)と合わせるのであれば、
  printf("Answer=%f\n",x);
となっていたほうが良いと思います。

Q^この記号を使わない

0.5乗をやりたいのですが、タイトルの通り、「^」の記号を使わずにできないものでしょうか。このままでもコンパイルされるのでしょうか?
私はコンパイラを持っておらず、今すぐ結果を見ることができません。
初心者向けの講座があるようなサイトも数カ所見てみたのですが、このことについては見つけられませんでした。
やろうとしているのは二次関数の計算をcでやる、ということです。
その部分以外はできていて、あとちょっとというところです。
プログラミングの方は初心者に毛が生えかけた程度です。よろしくおねがいします。

Aベストアンサー

#1で回答したものです。
書き忘れたので、補足を。

Cでは、「^」この記号には別の意味(ビット毎のxor)があるので
n乗のイミでは使えません。
n乗のときは"math.h"にpow()という関数があるのでそれを使います。
0.5の時だけは、sqrt()でもいいんですが。

fortlanみたいないわゆる計算機言語でも、
n乗は**という風に書いたと思います。
「^」を使う言語は、たぶんないんじゃないかと思います。

Q入力した数値を0~3乗するプログラム (C言語)

この前学校の授業でやり方がわからなかったことがあるので質問させていただきます。

scanfを使って入力した整数を0~3乗したものを出力するプログラムをかけ

ちなみに7を入力すれば、
7^0=1,7^1=7,7^2=49,7^343
と出力されるようにしなさい

という問題が出ました。

これは掛け算を使って作るのでしょうか?

このプログラムの作り方と解答例をご教授願います。

Aベストアンサー

以下のようにしてください。
--------------------------------------------
#include <stdio.h>
int main(void)
{
int result = 1;
int x;
int i;
printf("x=");
scanf("%d",&x);
printf("x=%d\n",x);
for(i = 0; i < 4;i++) {
printf("%d^%d=%d\n",x,i,result);
result = result * x;
}
return (0);
}
-----------------------------------------
7を入力したときの実行結果
x=7
x=7
7^0=1
7^1=7
7^2=49
7^3=343
--------------------------------------
CentOS release 5.6 (Final)
gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-50)
で動作確認済みです。

以下のようにしてください。
--------------------------------------------
#include <stdio.h>
int main(void)
{
int result = 1;
int x;
int i;
printf("x=");
scanf("%d",&x);
printf("x=%d\n",x);
for(i = 0; i < 4;i++) {
printf("%d^%d=%d\n",x,i,result);
result = result * x;
}
return (0);
}
-----------------------------------------
7を入力したときの実行結果
x=7
x=7
7^0=1
7^1=7
7^2=49
7^3=343
--------------------------------------
CentOS release 5.6 (Final)...続きを読む

Q三角関数の記述の仕方

タイトルそのまんまなんですが、三角関数はC言語ではどのように記述すればいいでしょうか?
角度にラジアン表記でπ(パイ)を使いたいんですが、その表記方法もわかりません。
僕の持っている本に載ってなかったので質問させていただきました。
よろしくお願いします。

Aベストアンサー

C言語で三角関数を使うためには、math.h をインクルードする必要があります。使い方は例えば、こんな感じです。

#define M_PI 3.14159265358979 /* 円周率 */

double x, y, theta;

theta = M_PI / 4.0;
x = cos(theta); /* sin,cos,tanの引数は弧度法の角度です。*/
y = sin(theta);

πは上記の例のように自分で定義して使ってください。

Qprintf で二進表示を行いたい。

すみません。教えていただきたいことがあります。
printf で普通のintの値をフォーマット指定子を使用して二進表示をしたかったのですが見当たりませんでした。
どうにかintの内容を二進で確認したいのですが、どのようにすれば良いですか?
宜しくお願いします。

Aベストアンサー

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if ( value & bit ){
  putchar('1');
 }
 else{
  putchar('0');
 }
}
printf( " です。\n" );

最後に:
・1バイトが 8 ビットの環境が前提です。→まぁ、普通は 8 ビットですが…。
・上記のサンプルを関数などにすれば使いやすくなります。→print_bin()など
・以上。おわり。

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC言語のpow関数の不具合

linux(ubuntu)の上でgccを使っています。

powの関数がおかしいです。

pow(10,-1)を計算させると正しく1e-1が出力されます。

#include <math.h>
#include <stdio.h>

int main(void){

double x = -1;
printf("%f",pow(10,x));

return 0;
}
上記のプログラムを走らせると、

In function "main";
*****.c:(.text+0x2d):undefined reference to 'pow'
collect2: ldはステータス1で終了しました。

というエラーメッセージがでます。

なぜかpow関数の中に変数を入れるとプログラムが動きません。

Aベストアンサー

math.h のライブラリにある関数を使うには、libm をリンクする必要があるので、gcc のコマンドラインに -lm という指定が必要です。
printf などの関数は、libc に入っており、これは指定しなくても参照されます。

pow(10,-1)で -lm がなくてもエラーにならなかったのは、他の方が書いてますが、コンパイラが結果を計算してしまって実際にpowを呼ぶようなコードを生成しなかったからでしょう。
つまり、printf("%f",pow(10,-1)); が、printf("%f",1e-1); に最適化された。

Qエクセルで計算すると2.43E-19などと表示される。Eとは何ですか?

よろしくお願いします。
エクセルの回帰分析をすると有意水準で2.43E-19などと表示されますが
Eとは何でしょうか?

また、回帰分析の数字の意味が良く分からないのですが、
皆さんは独学されましたか?それとも講座などをうけたのでしょうか?

回帰分析でR2(決定係数)しかみていないのですが
どうすれば回帰分析が分かるようになるのでしょうか?
本を読んだのですがいまいち難しくて分かりません。
教えてください。
よろしくお願いします。

Aベストアンサー

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるための指数表記のことですよ。
・よって、『2.43E-19』とは?
 2.43×1/(10の19乗)で、
 2.43×1/10000000000000000000となり、
 2.43×0.0000000000000000001だから、
 0.000000000000000000243という数値を意味します。

補足:
・E+数値は 10、100、1000 という大きい数を表します。
・E-数値は 0.1、0.01、0.001 という小さい数を表します。
・数学では『2.43×10』の次に、小さい数字で上に『19』と表示します。→http://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98
・最後に『回帰分析』とは何?下の『参考URL』をどうぞ。→『数学』カテゴリで質問してみては?

参考URL:http://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるた...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング