C言語でべき乗表現

こんにちは、NAKAといいます。

C言語基礎を確認させてください。

pow()っていう関数を使うと思うのですが

例えば2^15って0x8000だと思うのですが、実際やってみると0x7FFFになってしまいます。

Parents
  • NAKAさん、こんにちは。Sugachanceです。

    NAKAさんの場合、RL78なのかRXなのかRH850なのかはたまた他のやつなのか…
    分かりませんが、手元のRL78の環境の場合仰るように0x7FFFになりました(intに渡した時)。

    pow()関数自体、引数も戻値もdouble型ですが、
    RL78の環境だとdoubleはfloatと同じ4バイト(だった気がするので)
    そのあたりの精度・切り捨てとキャストの兼ね合いな気がします。

    double ans;
    int ansi;
    ans = pow(2,15);
    ansi= pow(2,15);

    の結果をウォッチで見てみたら
    ans 3.276798E+004 float(4)
    ansi 32767 (0x7fff) int(2)

    ってなってました。

    先日、Cに関して素人レベルだと怒られてしまったので
    プロレベルの詳しい方の解説が欲しいところです!

  • doubleのオプションを付けたら
    ans 3.276800000000004E+004 double(8)
    ansi -32768 (0x8000) int(2)
    になりました!

  • Sugachanceさん お久しぶりです。
    ナカです。いつもありがとうございます。
    僕も、基礎がないのですぐつまずいちゃいます。

    じつは先日までpow関数も知らずに A=2^15;とか書いちゃって
    「おかしいなあ計算結果が全然ちがう!」とかやってました(*_*)
    ビルドでエラーが出ないと正しいと思いこんじゃいますね。

  • Sugachanceさん NAKAです。


    >doubleのオプションを付けたら
    ⇒ってどこのオプションでしたっけ?
    プロパティのコンパイラ・オプションくらいかなと早合点してました。

    やっぱり、なんか変です。

    pow(2,2)=0x3になっちゃうし

    mathfをインクルードたら更におかしなことになりました。

    RL78でもRH850でも同じ感じでした。


    0.5乗は上手くいく!

    やっぱり、変

  • NAKAさん、こんにちは。NoMaYです。

    > 数学的本質みたいなのは理解できてませんが、

    この文面を見た時、これは分かっていないサインかな、と感じたのですけれども、そういうことだったな、と思いました。数値計算の分野では、浮動小数点数での数値計算ライブラリの計算結果が、机上の計算結果とは一致しないことがある、というのは常識といってもよいようなことなのです。

    (例) 実際に計算していないので、たまたま、うまくいくこともあるかもしれません。

    (1) 0.001を1000個足したからといって、1.000(それ以下の桁は省略) になるとは限らない
    (2) √2 × √2 = 2 ではあるけども、SQRT(2.000) × SQRT(2.000) = 2.000(それ以下の桁は省略) になるとは限らない
    (3) 2の2乗 = 4 ではあるけれども、POW(2.000, 2.000) = 4.000(それ以下の桁は省略) になるとは限らない

  • NAKAさん こんにちは。Sugachanceです。

    私がいじったのはコンパイルオプションのdouble型/long~のところです。
    正しくはつけたらというか、いいえにしたらですが…

Reply
  • NAKAさん こんにちは。Sugachanceです。

    私がいじったのはコンパイルオプションのdouble型/long~のところです。
    正しくはつけたらというか、いいえにしたらですが…

Children
No Data