sin関数の計算結果がGR-SAKURAと違う?

ド素人ですw。以前にGR-SAKURAのフォーラムで「8×8×8のLED-CUBEを作ったけど、うまく動かない」で助けて頂いた者です。

https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-sakura/3717/thread

同じLED-CUBEをとある事情で、SAKURA->秋月で買ったRX621ボードへの移植をしてます。(せっかくかわいいSAKURAボードは、他の用事に使おうかとw)

e2studioで作ってます。なんとかほぼ動くようになったのですが、sinを使ってる所でSAKURAとLEDの表示が違います…。

SAKURAの方のプログラムの該当部分は、

1 :  void ripples(int times, int repeat)
2 :  {
3 :    int i,j,k,z;
4 :    float distance,ztemp;
5 :    clearData();

6 :    for(k=0;k<=repeat;++k) {
7 :      for(i=0;i<=3;++i) {
8 :        for(j=0;j<=3;++j) {
9 :          distance=sqrt((3.5-(float)i)*(3.5-(float)i)+(3.5-(float)j)*(3.5-(float)j));
10:          ztemp=3.5+sin(distance/1.3+(float)k/3.14159)*3.5;
11:          z=(int)(ztemp+0.5);
12:          bitSet(dispData[z][i],j);
13:          bitSet(dispData[z][7-i],j);
14:          bitSet(dispData[z][i],7-j);
15:          bitSet(dispData[z][7-i],7-j);
16:        }
17:      }
18:      LEDDisp(times);
19:      clearData();
20:    }
21:  }

LED表示用配列の辺は見ないで頂いて(移植に伴いbitsetー>ビットシフトに変えてます)、9~11行目の式で、がじぇるねのwebコンパイラでビルドしたSAKURAと、e2studioでビルドしたRX621ボードとで、計算結果が異なる原因が何かあるでしょうか…?

sqrtとsinをsqrtfとsinfに変えてみたりとか、型指定を外してみたりとかしても、変わらない様です。

(printfで計算結果を確認しようとしたのですがうまくいかないので、ほんとに計算結果が違うかどうかは確認できていません…)

どなたかご助言頂けると助かります。

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

    まず、コンパイラはGNURXでしょうか?CC-RXでしょうか?また、バージョンは幾つでしょうか?それと、GNURXの場合は、ライブラリはOPTLIB(古いe2 studioのデフォルト)でしょうか?NEWLIB(最近のe2 studioのデフォルト)でしょうか?さらに、以前のスレッドを見直してみたのですが、GR-SAKURAでのコンパイラに何を使われていたのか不明でしたので、その情報も必要かな、と思います。WEBコンパイラ?(時期は?)、IDE4GR同梱コンパイラ?(IDE4GRのバージョンは?)、です。

    sin関数の計算結果が違うらしい、ということで思い浮かぶのは、RX63NとRX621ではソフトウェアライブラリによる近似計算ですので、ライブラリの違いによって微妙な差が出る可能性はあると思います。(あくまで可能性です。) あと、C言語仕様では、float型はdouble型にキャストされて関数に引き渡されますけど、コンパイラオプションでキャストを抑止出来たりしますので、その辺りのコンパイラオプションが異なっている可能性も考えられます。(今のところ可能性です。) あと、引数が2πを超えた時の挙動がどうなっているかも気になります。

    コンパイラの情報が不明ですので次の手には移れませんが、その辺りが明確になれば、ハードを持たない私がやれる手としてはシミュレータでデバッグして計算結果の違いを調べることになるかと思います。

    他方、もしハードを持っていれば、printfで確認するのが手っ取り早そうかな、とも思います。ただ、浮動小数点数のprintfは落とし穴もそれなりに予想されますので、事前の試行錯誤は必要かも知れないかな(まるっきり最初からprintfを信用して使うのは危ないかも)、とも思います。

    ちなみに、koheiさんがprintfで計算結果を確認しようとしてうまく行かなかったのは、どんな点でしょうか?

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

    まず、コンパイラはGNURXでしょうか?CC-RXでしょうか?また、バージョンは幾つでしょうか?それと、GNURXの場合は、ライブラリはOPTLIB(古いe2 studioのデフォルト)でしょうか?NEWLIB(最近のe2 studioのデフォルト)でしょうか?さらに、以前のスレッドを見直してみたのですが、GR-SAKURAでのコンパイラに何を使われていたのか不明でしたので、その情報も必要かな、と思います。WEBコンパイラ?(時期は?)、IDE4GR同梱コンパイラ?(IDE4GRのバージョンは?)、です。

    sin関数の計算結果が違うらしい、ということで思い浮かぶのは、RX63NとRX621ではソフトウェアライブラリによる近似計算ですので、ライブラリの違いによって微妙な差が出る可能性はあると思います。(あくまで可能性です。) あと、C言語仕様では、float型はdouble型にキャストされて関数に引き渡されますけど、コンパイラオプションでキャストを抑止出来たりしますので、その辺りのコンパイラオプションが異なっている可能性も考えられます。(今のところ可能性です。) あと、引数が2πを超えた時の挙動がどうなっているかも気になります。

    コンパイラの情報が不明ですので次の手には移れませんが、その辺りが明確になれば、ハードを持たない私がやれる手としてはシミュレータでデバッグして計算結果の違いを調べることになるかと思います。

    他方、もしハードを持っていれば、printfで確認するのが手っ取り早そうかな、とも思います。ただ、浮動小数点数のprintfは落とし穴もそれなりに予想されますので、事前の試行錯誤は必要かも知れないかな(まるっきり最初からprintfを信用して使うのは危ないかも)、とも思います。

    ちなみに、koheiさんがprintfで計算結果を確認しようとしてうまく行かなかったのは、どんな点でしょうか?

Children
  • 「ド素人です」とお断りしたのにww。全然ズレた返答をしたらごめんなさいw。(あと、画像がキレイに貼れなかったらごめんなさい。)

    コンパイラとバージョンは…、

    この画面の

    ツーツチェーン:Renesas CCRX

    バージョン:v3.02.00

    の事でしょうか…。

     

    ライブラリーは…、

    この画面の事ではなさそうですね…

     

    printfは、ビルドで何かエラーが出て通らなかったのですが、

    別のサンプルプログラム作ってビルドしたら、そちらはエラー無しで通りました…。どこが違うのか、これから考えます…w。

    そもそもprintfは…どこに出力されるのでしょう?試してみた他のボード(例えばnucleoのSTM32F411)では、COMポートに認識されてTeraTermとかで受け取れたのですが、それはnucleoボードのST-LINKが複雑な通信を肩代わりしてくれてるだけで、普通のボードはSerial通信を定義してあげたりしないと、パソコン側とのデータやりとりはできないのかな…?(E2エミュレータみたいなものを持ってないと、確認しながらのデバッグはできないのかな…)

     

    型変換の罠か、「sinは何も書かないとラジアンじゃなくて度よ」とか、何か「そりゃそうよ」的な単純な罠があるのでは?と質問させて頂いたのですが、そうでもないのでしょうか。

    WEBコンパイラーは…、今日見ると「2018-12-19 Version 3.00」と書いてありますw。いつコンパイルしたか忘れましたが、多分今日ビルドしても同じ結果と思います。

     今晩・明日ちょっと忙しいので、日曜中にもう一度SAKURAに差し替えしてみて、LEDの表示が「結果としてどう違うのか」、動画を取りたいと思います。

  • > E2エミュレータみたいなものを持ってないと、確認しながらのデバッグはできないのかな…

    E1とかE2とかE2liteとかなしで作業されていてビルドが通ったHEXファイルをUSBかシリアルで書き込んで実行して確認、とかされてるのですか
  • RXシリアルデバッガ
    www.renesas.com/.../rx-serial-debugger.html

    こんなのもありましたね

    > CS+ V3.01.00以降では使用できません。

    今では使用は厳しい感じかしら