GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
GR-CitrusでRubic Version: 0.2.4を使ってみています。
board_version: Ver.CITRUS-1.95(2016/5/30)f3(256KB)です。
少数の計算がうまくできないのですが、原因お判りになりますでしょうか?
以下のコードでは、value = 1024 と正しく出力されます。
#!mrubyserial = Serial.new(0, 115200)value = 110.times { value = value * 2 }serial.println("value = #{value}")
以下のコードでは、value=0と出力されます。
#!mrubyserial = Serial.new(0, 115200)value = 1.010.times { value = value * 2.0 }serial.println("value = #{value}")
以下のコードで試したところ、出力は "NG" と "2.0 => 0" でした。
そもそも 0.5 == 0 が成り立ってしまっているあたり、浮動小数のリテラルが内部表現では"整数0"に置き換わっているようですね。
#!mruby
serial = Serial.new(0)
serial.println("NG") if 0.5 == 0
serial.println("2.0 => #{2.0}")
>たろサさん
いま使われているlibmruby.aって、浮動小数の設定はどうなっていますでしょうか?
Rubicのコンパイル結果は以下の通りで、浮動小数としてリテラルをロードするようになっています。
気になるとしたらmrubyのバージョンずれ?(1.1.0-Rubicと1.2.0-CITRUS)
RITEバイナリバージョンは同じですので問題無いと思っているのですが。
mruby 1.1.0 (2014-11-19)
00002 NODE_SCOPE:
00002 local variables:
00002 serial
00002 NODE_BEGIN:
00002 NODE_ASGN:
00002 lhs:
00002 NODE_LVAR serial
00002 rhs:
00002 NODE_CALL:
00002 NODE_CONST Serial
00002 method='new' (11)
00002 args:
00002 NODE_INT 0 base 10
00003 NODE_IF:
00003 cond:
00003 NODE_CALL:
00003 NODE_FLOAT 0.5
00003 method='==' (64)
00003 args:
00003 NODE_INT 0 base 10
00003 then:
00003 NODE_LVAR serial
00003 method='println' (220)
00003 NODE_STR "NG" len 2
00004 NODE_CALL:
00004 NODE_LVAR serial
00004 method='println' (220)
00004 args:
00004 NODE_DSTR
00004 NODE_STR "2.0 => " len 7
00004 NODE_BEGIN:
00004 NODE_FLOAT 2.0
00004 NODE_STR "" len 0
irep 0x52dea0 nregs=5 nlocals=2 pools=5 syms=4 reps=0
file: /main.rb
2 000 OP_GETCONST R2 :Serial
2 001 OP_LOADI R3 0
2 002 OP_SEND R2 :new 1
2 003 OP_MOVE R1 R2 ; R1:serial
3 004 OP_LOADL R2 L(0) ; 0.5
3 005 OP_LOADI R3 0
3 006 OP_EQ R2 :== 1
3 007 OP_JMPNOT R2 011
3 008 OP_MOVE R2 R1 ; R1:serial
3 009 OP_STRING R3 L(1) ; "NG"
3 010 OP_SEND R2 :println 1
4 011 OP_MOVE R2 R1 ; R1:serial
4 012 OP_STRING R3 L(2) ; "2.0 => "
4 013 OP_LOADL R4 L(3) ; 2.0
4 014 OP_STRCAT R3 R4
4 015 OP_SEND R2 :println 1
4 016 OP_STOP
きむしゅさん>
ご確認ありがとうございます。誤字していました、すみません・・・(少数 -> 小数)
私の方でもRubicでコンパイルしたmrbをLinux上でソースからコンパイルしたmrubyで動かしてみるとか色々試してみました。
Rubic側は問題なさそうですね。
こんにちは、たろサです。
確認はしましたが、私も原因がわからない状態です。
libmruby.aをmakeするときに、一緒に生成されるcygwinのmrubyで実行すると、小数計算します。
ということは、rx-elf-gccのオプションか、mrbgemsを入れないといけないのか・・。もしくは、mrbconfig.hの設定になるのですが、
github.com/.../mruby1.2.0
↑ここに上げているような設定をしているだけです。
これを試しては、どうでしょうか?とか、ありますでしょうか。
たろサさん>
ご確認ありがとうございます。根が深そうですね。
mrbgems の mruby-numeric-ext を使っているようですが、これが原因の可能性はありませんか?
一度、mruby-numeric-extを外してビルドしてみていただけないでしょうか?
conf.gem "#{root}/mrbgems/mruby-numeric-ext" #10.chr
たろサです。
小数計算ができました。
libmrubyコンパイルのtoolchainに浮動小数計算オプションを付けていませんでした。
---------
(emscripten) [exitstatus: 0]
[Run main.mrb]
2.0 => 2
[Finish main.mrb]
githubのwrbb-v2lib-firmに最新citrus_sketch.binをコミットしました。
github.com/.../wrbb-v2lib-firm
ダウンロードしてお試しください。
動きました!
ありがとうございます!