浮動小数の変換


oitan  2015-09-15 12:08:18  No: 47627

どなたかご教授下さい。

現在OSC(OpenSoundControll)を使用した音響機器制御ソフトを作成中ですが、
浮動小数の変換が解決出来ずに難義しております。

procedure TForm1.Dat_Conv(Dat_OSC:string);
var
 OSC_Array: array [1..4] of Byte;
 J:integer;
 ST:Single;
begin
 ST:=StrToFloat(Dat_OSC);
 for J:= 1 to 4 do begin OSC_Array[J] :=0;  Move(ST, OSC_Array, 4);end;
 OSC_Data:= chr(OSC_Array[4]) + chr(OSC_Array[3]) + chr(OSC_Array[2]) + chr(OSC_Array[1]);
 Memo1.Lines.Add('OSC_Data= ' + Format('$%.2x  $%.2x  $%.2x  $%.2x', [OSC_Array[4], OSC_Array[3], OSC_Array[2], OSC_Array[1]]));
end;

上記コードで変換したデータを機器に送信していますが、旧Delphi(ver5)では全く問題なく動作しています。
ところがモバイルアプリのためDelphi XE8 に同コードを書き換えたところ  Data 0.49 〜 0.24 を送信すると0.18になってしまいます。
画面上には正常な計算値が表示されるのですが、WireShark(トラフィック監視)で送信Dataを見ますと送信された値は0.18となっており、機器も0.18の値を受信しています。
原因は浮動小数の変換なのだろうと思うのですが解決方法が見当たらずHelpファイルと格闘しながら毎日途方にくれています。どなたかご教授を!

ちなみに OSはWin8/Win7/WinXP 言語ソフトは Delphi5 / DelphiXE8 / Delphi10(トライアル) / C++Builder5 / C++Builder10(トライアル) 全て試しましたが結果は同じでした。


マッコ  2015-09-15 14:24:29  No: 47628

はずしていたらごめん
X86は通常リトルエンディアン
OSCの文法はビッグエンディアンを使用するので
逆順に変えればいいはずです
  OSC_Array[4] := Byte(Dat_OSC[1]);
  OSC_Array[3] := Byte(Dat_OSC[2]);
  OSC_Array[2] := Byte(Dat_OSC[3]);
  OSC_Array[1] := Byte(Dat_OSC[4]);


通りすがり  2015-09-15 15:28:37  No: 47629

StringがUnicodeStringになってるのを忘れてるんじゃあ?


Oitan  2015-09-15 23:48:33  No: 47630

マッコさん、通りすがりさん、早速のご指導ありがとうございます。

私の質問文の未熟さとコードの汚なさでしょうが、ビッグエンディアン化やUniCodeは解決されており、OSCデータとして機器も認識、動作しています。

ちなみに計算値ではなく  $3e $fa $e1 $48 (0.49) から $3e $85 $1e $b8 (0.26)を直接送信してみましたが結果は全て $3e $3f $3f $3f (0.18)になってしまいます。
0.50より上と0.25より下は正常値なのですが・・・・・
しかもDelphi5では何の問題も無く・・・・XEシリーズの浮動小数点の扱いや精度の問題なのでしょうが、データをダイレクト送信しても結果が同じだと、もう私の能力では解決策が見つかりません・・・・


tor  2015-09-16 00:32:57  No: 47631

データをダイレクト送信しても結果が同じとなると、浮動小数というのは関係なくてむしろ送信の段階でデータ化けしているように聞こえるのですが。
・変数ヲサマモテ゜トヲサの型は何でしょう?ヲサチモですか?
・モヤの値は想定通りですか?
・マモテ゜チの中身を表示しているけれど、それは想定通りの内容になっていますか?
・デバッガなどでマモテ゜トの中身を見たら、想定通りの内容(例えばヲサ」、ウ」、」、ア」、エクヲサのような文字列)になっていますか?
・実際に送信する処理はどうなっていますか?

ついでに問題には関係ないけど気になったところで、ヘをエ回繰り返してるけどア回でいいですよね。
(マモテ゜チのークリア自体、どうせ上書きするのだから必要ない気が……)
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーケッアオィ火ゥ アオコウエコエキ  書込者ノト:ロ ァ。   ン

変換してる所じゃなく送信してる部分に問題があるとかじゃないんです?

ちなみにマモテ゜トて言うのが送信するデータですか?
そして型ですか?
型だとしたらマモテ゜トに格納されてるデータ列は期待したデータ列になってますか?
スススススススススススススススススススススススススススススススススススススススス
ニコ えび
トコ イーアオッーケッアオィ火ゥ アオコエキコオキ  書込者ノト:ロ 「。。  ン

トイーーキで試してみましたが、
ーョエケヲサ〜ヲサーョイエの値は丸め誤差が発生してるようですね。

ヲサーョエケ→ーョエケーーーーーーケオウカキエウ
ヲサーョイエ→ーョイウケケケケケケエカウオオクイ

マモテって使った事ないので知りませんが、相手が受け取るエバイトと
トのモのエバイトの形式が違うんじゃないでしょうか。

あと、これはループの中に要らないんじゃないでしょうか
ヲサヘィモヤャヲサマモテ゜チャヲサエゥ
スススススススススススススススススススススススススススススススススススススススス
ニコ えび
トコ イーアオッーケッアオィ火ゥ アオコオアコーケ  書込者ノト:ロ 「。。  ン

丸め誤差は他の値でも出てるようなので直接関係無いようでしたね
すいません
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーケッアオィ火ゥ アカコーアコエア  書込者ノト:ロ 」 ァ」ハノ

 ン

ふむむ、軽く試してみたところ、思った通り(と後付けで言ってみる)テがクサいですね。

ティゥヲサ関数の戻り値はテ型です。トヲサイーーケ以降ではこれはラテ型と同じになります。
つまりチホモノ→ユの変換が発生するので、チモテノノコードの範囲(ー〜アイキ)にない文字は別のコードに変換されてしまう可能性があります。
というわけで、テを通さず直接ヲサチティゥォチティゥォョョョヲサとしたらどうでしょうか。
もちろん最終結果もチモでないとあかんですよ。
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アカコイイコアア  書込者ノト:ロ 「。・「、  ン

さん、さん早速のご指導ありがとうございます。

全体を把握して頂けるような質問文を書けずに申し訳ありません。
テスト用の小さなものを書きましたので掲載させて頂きます。

ヲサユアサ

ヲサヲサラョラャヲサラョヘャヲサモョモユャヲサモョヨャヲサモョテャヲサヨョヌャ
ヲサヲサヨョテャヲサヨョニャヲサヨョトャヲサヨョモテャヲサノツテャヲサテャ
ヲサヲサノテャヲサノユトミツャヲサノユトミテャヲサモョヘャヲサヨョツサ

ヲサヲサヤニアヲサスヲサィヤニゥ
ヲサヲサヲサヲサナアコヲサヤナサ
ヲサヲサヲサヲサテツアコヲサヤテツサ
ヲサヲサヲサヲサナウコヲサヤナサ
ヲサヲサヲサヲサモツアコヲサヤモツサ
ヲサヲサヲサヲサモツイコヲサヤモツサ
ヲサヲサヲサヲサノユトミテアコヲサヤノユトミテサ
ヲサヲサヲサヲサヘアコヲサヤヘサ
ヲサヲサヲサヲサフアコヲサヤフサ
ヲサヲサヲサヲサフイコヲサヤフサ
ヲサヲサヲサヲサフウコヲサヤフサ
ヲサヲサヲサヲサヲサモツイティモコヲサヤマゥサ
ヲサヲサヲサヲサヲサテ゜モィマモコゥサ
ヲサヲサヲサヲサヲサト゜ティト゜マモテコゥサ
ヲサヲサヲサヲサヲサモツアティモコヲサヤマゥサ
ヲサヲサヲサヲサヲサナウヒトィモコヲサヤマサヲサヲサヒコヲサラサヲサモコヲサヤモモゥサ
ヲサヲサ
ヲサヲサヲサヲサヲサミヲサ宣言ヲサ
ヲサヲサ
ヲサヲサヲサヲサヲサミヲサ宣言ヲサ
ヲサヲササ

ヲサヲサニアコヲサヤニアサ
ヲサヲサマモテ゜トコサ
ヲサヲサテ゜モコサ
ヲサヲサモ゜マモテコサ

、メヲサェョ

ヲサヤニアョテ゜モィマモコゥサ

ヲサテ゜モャヲサヲサコサ

ヲサッッマモテヲサテの生成
ヲサテ゜モコスマモサ
ヲサテ゜モヲサコスヲサエヲサュヲサィフィテ゜モゥヲサヲサエゥサ
ヲサヲサコスアヲサヲサィテ゜モゥヲサヲサテ゜モヲサコスヲサテ゜モヲサォヲサ」ーサ

ヲサヤニアョト゜ティト゜マモテコゥサ

ヲサマモテ゜チコヲサヲサロアョョエンヲサヲサツサ
ヲサハコサ
ヲサモヤコモサ

ヲサモヤコスモヤニィト゜マモテゥサ
ヲサッッツナ化とエツトの生成
ヲサヲサハコスヲサアヲサヲサエヲサヲサヲサマモテ゜チロハンヲサコスーサヲサヲサヘィモヤャヲサマモテ゜チャヲサエゥササ
ヲサマモテ゜トコスヲサィマモテ゜チロエンゥヲサォヲサィマモテ゜チロウンゥヲサォヲサィマモテ゜チロインゥヲサォヲサィマモテ゜チロアンゥサ
ヲサヘアョフョチィァマモテ゜トスヲサァヲサォヲサニィァ、・ョイヲサヲサ、・ョイヲサヲサ、・ョイヲサヲサ、・ョイァャヲサロマモテ゜チロエンャヲサマモテ゜チロウンャヲサマモテ゜チロインャヲサマモテ゜チロアンンゥゥサ

ヲサヤニアョモツイティモコヲサヤマゥサ

ヲサヲサナウョヲサスヲサァァヲサヲサヲサモヘィァマモテ゜トが入力されていません。ァゥサササ
ヲサヲサモヤニィナウョゥヲサヲサヲサアョーーヲサヲサヲサモヘィァトはーョーー〜アョーーの範囲内です。ァゥサナウョコスァァサササ

ヲサテ゜モィナアョゥサ
ッッヲサヲサト゜ティナウョゥサヲサッットオで使用
ヲサヲサヲサト゜ティニヤモィモメヤィモヤニィナウョゥャュイゥゥゥサッットリナで使用

ヲサヲサヲサノユトミテアョモィテ゜モヲサォヲサァャァヲサォヲサテツアョヲサォヲサ」ーヲサォヲサ」ーヲサォヲサマモテ゜トゥサ

ッッヲサヲサヲサーョエーをダイレクト送信時
ヲサヲサヲサノユトミテアョモィテ゜モヲサォヲサァャァヲサォヲサテツアョヲサォヲサ」ーヲサォヲサ」ーヲサォ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサィモヤノィァ、ウァゥゥヲサォヲサィモヤノィァ、ァゥゥヲサォヲサィモヤノィァ、ァゥゥヲサォヲサィモヤノィァ、ァゥゥゥサ

ヲサヤニアョナウヒトィモコヲサヤマサヲサヲサヒコヲサラサ
ヲサヲサモコヲサヤモモゥサ

ヲサヲサィヒスヨピメナヤユメホゥヲサヲサヲサモツイティモゥササ

ヲサヤニアョモツアティモコヲサヤマゥサ

ヲサヘアョコスァァサ

汚いコードですが、流れを把握して頂けるかと思います、なにとぞご指導をお願い致します。

追伸:トラフィック監視上で実送信されているデータはヲサーョアクカキカオヲサです。
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アカコイケコアク  書込者ノト:ロ 「。・「、  ン

さん、ご指導頂いたチティゥで試しましたが・・・一緒でした。
ありがとうございました。もっと頑張ってみます。
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アカコウカコオエ  書込者ノト:ロ 「。・「、  ン

さん、追伸ですが、
はチモのエイリアスなのであまり気にしておりませんでしたが
チモはモバイルコンパイラでサポートされていないのでモにしています。
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アカコオーコーオ  書込者ノト:ロ 「。・「、  ン

すみません、さらに追伸です。

上記掲載コード中、ナアには  ッッーアッッヲサ等のマモテコマンドが入ります。
テツでは  ヲサャヲサヲサャヲサヲサィはヲサはヲサはゥヲサなどのトヤヲサを指定しています。
ナウにはヲサーョーーヲサ〜ヲサアョーーヲサまでの送信トを入力します。
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アキコイエコオウ  書込者ノト:ロ 「。・「、  ン

私の低レベルの質問方法で皆さんのお手を煩わせて申し訳ありません。

質問方法を変えて、改めてご教授頂きたいと思いますが、

現在抱えている問題は

  ア、トオで有効なデータがなぜリナでは一部分のみが有効ではないのか?
    ヲサ私は残念な事にトオとリナの浮動小数点の扱いの違いが解明出来ていません。  

  イ、浮動小数点を小数点以下イ桁で切っているにも関わらずなぜーョアクカキカオと送信されるのか?

以上です。
ここが解決できれば全てクリアされそうなのですが、どなたかご指導を!
スススススススススススススススススススススススススススススススススススススススス
ニコ 通りすがり
トコ イーアオッーケッアオィ火ゥ アキコウーコウア  書込者ノト:ロ 」。 。 ン

モはユモですよ?つまりモのア要素のサイズはイバイトです。ホナリヤヌナホコンパイラのことを気にしないなら
ィ明示的にゥチモを、気にするならヤツヲサコッッョョッフッモッッモョモユョヤツヲサを
使わないと、思うような結果は得られません。

あと本筋とは関係ありませんが、
ヲサ
ヲサヲサヲサマモテ゜トコサ
ヲサヲサヲサテ゜モコサ
ヲサヲサヲサモ゜マモテコサ
はやめましょう。ヤニアのメンバにすべきです。
スススススススススススススススススススススススススススススススススススススススス
ニコ 通りすがり
トコ イーアオッーケッアオィ火ゥ アキコウオコウー  書込者ノト:ロ 」。 。 ン

すれ違ったみたいですが、『現在抱えている問題』はおそらく的外れです。理由は上に書いたとおりです。
とりあえずヤノユトミテョモではなくヤノユトミテョモツを使うようにし、それにあわせて
送信データをヤノツィスヲサヲサツゥで組み立てるように変更してみてはいかがでしょう。
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アクコークコアケ  書込者ノト:ロ 「。・「、  ン

通りすがりさん、ありがとうございます。
ご指摘のように変更し、試しましたが結果は同じでした。

確認用画面でもデバッガ上でも何も問題がありません、でも送信されてるデータはーョエケからーョイカまでのすべてが同じーョアクカキカオです。  受信した機器もその設定値を取っており、トラフィック監視上もーョアクカキカオのデータが流れています。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーケッアオィ火ゥ アクコウアコエク  書込者ノト:ロ 」 ァ」ハノ

 ン

ヲサヲサ確認用画面でもデバッガ上でも何も問題がありません
とのことですが、何も問題ないならデータは化けてないはずですよね?
どこまでを実際に確認したのでしょうか。
ィアゥヲサモヤの値は期待値どおりですか?
ィイゥヲサマモテ゜チの中身は期待値どおりですか?
ィウゥヲサマモテ゜トの中身は期待値どおりですか?
ィエゥヲサノユトミテアョモに渡しているデータの中身は期待値どおりですか?
ィオゥヲサ実際に送信されたデータの中身は期待値どおりですか?

どこまで正しくてどこからおかしいか確認することで、どこに問題があるか絞り込めます。
ィアゥの段階でおかしいなら「浮動小数点の扱いや精度の問題」と言えますが
そうでないならデータ受け渡しの際に化けているのが問題で、浮動小数点云々は無関係です。

で、チモテノノコードの範囲外(」、クー以上)のコードがヲサ」、ウ(すなわちヲサァソァ)に変わっているという現象からすると、文字コード変換されて不正な文字列になっている可能性が高いと思いますよ。
何番目と何番目の間で化けているか調べれば、どの処理で化けているかも特定できるはずです(一つだけとは限りませんけど)。
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アクコエキコアキ  書込者ノト:ロ 「。・「、  ン

通りすがりさん、追伸です。

一番厄介なのは、画面上もデバッガ上も何も問題が無いことです。
プログラム上は正常に見えております。
制御される実機とトラフィック監視がなければ気が付かない部分です。

実機等の環境は私固有のものなので、ご教授下さってる皆さんにはご迷惑をお掛けしている事は重々承知の上であえてご教授頂きたく質問させて頂いております。

ちなみに問題解決で一番最初に検索するのはここの過去ログで、浮動小数点等の過去ログはほぼ全て拝見いたしました。  また、つたない頭で考えうる変換等も全てを試みました。
ネニとネット検索に明け暮れてほぼ一か月・・・・途方にくれております。
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アクコオクコウキ  書込者ノト:ロ 「。・「、  ン

さん
ヲサヲサヲサ確認用画面でもデバッガ上でも何も問題がありません
ヲサとのことですが、何も問題ないならデータは化けてないはずですよね?
ヲサどこまでを実際に確認したのでしょうか。

ご指摘の通り、何も問題が無いのです、ただ送信されたトだけが一部分問題です。
ィアゥ〜ィエゥまでは正常です、しかしィオゥの一部分だけがリナでのみ画面表示やデバッガ上とは違ってしまいます。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーケッアオィ火ゥ アケコイイコオキ  書込者ノト:ロ 」 ァ」ハノ

 ン

念のため確認しますが、例えば送信したい値がヲサーョエーヲサの場合
ィアゥヲサモヤの値ヲサスヲサーョエー
これの単精度浮動小数点数の内部表現はヲサーウナテテテテテトヲサとなるので
ィイゥヲサマモテ゜チロアンヲサスヲサ、ウナャヲサマモテ゜チロインヲサスヲサ、テテャヲサマモテ゜チロウンヲサスヲサ、テテャヲサマモテ゜チロエンヲサスヲサ、テト
ィウゥヲサマモテ゜トヲサスヲサ」、ウナ」、テテ」、テテ」、テトヲサのエ文字の文字列(ァヲサフフヘァヲサのように見える……かも)

これがィウゥまでの期待値です。ちなみにヲサァヲサソソソァ(すなわち」、ウナ」、ウニ」、ウニ」、ウニ)のような文字列が見えたなら、そこですでに化けています。

で、例えば入力したコマンドがヲサァッッーアッッァ、
選んだトヤがァァなら、最終的にヲサノユトミテアョモヲサに渡すデータは
ァッッーアッッャァ」ー」ー」、ウナ」、テテ」、テテ」、テトヲサすなわち
ヲサイニヲサカウヲサカクヲサイニヲサウーヲサウアヲサイニヲサカトヲサカケヲサキクヲサイニヲサカカヲサカアヲサカエヲサカオヲサキイヲサイテヲサカカヲサーーヲサーーヲサウナヲサテテヲサテテヲサテト
というバイト列になるはずですね。実際にすべてこの通りだったでしょうか?
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアオィ火ゥ アケコウウコアオ  書込者ノト:ロ 「。・「、  ン

さん

ご指摘の部分はかなり前段階で確認した記憶がありますが、なおもう一度確認いたします。
ありがとうございます。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーケッアカィ水ゥ ークコエウコイキ  書込者ノト:ロ ァ。   ン

こんなのあるみたいだけど使ってみるとかどうでしょ?
コッッョッットマモテユ

あるいは、これの中身を参考に処理を組み立てるとか
スススススススススススススススススススススススススススススススススススススススス
ニコ おかぽん
トコ イーアオッーケッアカィ水ゥ ーケコウクコイキ  書込者ノト:ロ 「。」」、 ン

ヤノユトミテヲサのモメソッドの定義は、ィリナウですがゥ以下です。
ヲサモィヲサチトコヲササヲサチツナコヲサヤノヤナヲサスヲサゥサヲササ

チモとしてコマンドを生成しても、引数がユモなので、
そのままの値が送信されるとは限らないのでは?
通りすがりさんの発言通り、モツを使う方がいいと思います。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーケッアカィ水ゥ アアコウクコイエ シ  スュアセシ中級者セ シッニセシノヘヌ ス「コッッョョョッッイョ「 ス「ー「セ 書込者ノト:ロ 」。ァ」。 ン

浮動小数を文字列にするところがおかしいのか
文字列をユトミ送信するのがおかしいのか
分けて考えないと進まないのでは?

ッッヲサヲサヲサーョエーをダイレクト送信時
ヲサヲサヲサノユトミテアョモィテ゜モヲサォヲサァャァヲサォヲサテツアョヲサォヲサ」ーヲサォヲサ」ーヲサォ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサィモヤノィァ、ウァゥゥヲサォヲサィモヤノィァ、ァゥゥヲサォヲサィモヤノィァ、ァゥゥヲサォヲサィモヤノィァ、ァゥゥゥサ

これを引数渡しの前に文字列に代入する形にして、そこでブレーク
希望の文字列になっていれば、ユトミ送信処理の問題
希望の文字列になっていなければ、浮動小数変換の問題
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーケッアカィ水ゥ アウコエアコエー  書込者ノト:ロ ァ。   ン

ヤノユトミテョの内部でからヤツに変換する部分で化けてるっぽいですね。

モの第イ引数をにした場合変換にノヤナ゜チモテノノが使われるっぽいんで試験してみたら
ィモヤノィァ、ウァゥゥヲサォヲサィモヤノィァ、ァゥゥヲサォヲサィモヤノィァ、ァゥゥヲサォヲサィモヤノィァ、ァゥゥの文字列が見事にヲサウナヲサウニヲサウニヲサウニヲサになってました

んで、化けない奴を探してみたらノヤナ゜クツだと化けなかったので
モの第二引数にノヤナ゜クツヲサを渡せば化けずに送れるんじゃないでしょうか?
他の部分が化けないのかとかは見てないので不明です。
内部変換で思わぬデータに化けたりとかするんでやっぱ、自分で送信するバイト列組み立ててモツ使うのが良いんじゃないですかね
スススススススススススススススススススススススススススススススススススススススス
ニコ マ
トコ イーアオッーケッアカィ水ゥ アオコオクコエキ  書込者ノト:ロ 「。・「、  ン
モコ 

さん、ありがとうございました。
ヤナ゜クツで解決いたしました。

通りすがりさん、さん、おかぽんさん、さん、えびさん、みなさん本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加