アカウント名:
パスワード:
十数年仕事で(アマ時代を入れると20年以上)使っていたのに知らなかったので数日はまった。
バグったコードからエラー原因を簡素化したテストコードは以下。float型(i)とint型(k)で1ずつ加算していって異なったら標準エラーに出力。
#include <stdio.h>int main(){ float i; int k; i=0; for(k=0;k<=16777217;k++){ if(k != (int)i) fprintf(stderr,"%i %i\n",k,(int)i); i += 1; } return 0;}
えー常識だと思っていたけどな計算機イプシロンとかその辺で出てくる話題だと思た
計算機的な講義(世代により中学なり大学なり新人研修だったりするだろうけど)でイの一番に習いそうだけど。
浮動小数のバックグランドを知らない人間に浮動小数を扱わせてはいけない、の実例。
Z80用の単精度浮動小数点ライブラリを自分で書いてみたクチだから、どれくらい浮動小数点での加減算が信用できない(精度が足りなくなる)か身に染みて分かる。今は浮動小数点形式の構造ばかりか、スタックの構造やらポインタ、果てはデータのメモリ内での記憶方法なんぞを知らなくても良い時代になったと思えばいいのかなあ。
今はNCデータが割と身近にある仕事してるんだけど、それに慣れてると、小数はぜんぶ1000倍して常に整数で持たせたくなる。モノはでかくても4mくらいだし。
なぜ1024倍でないのか?
0.001mm を 1024倍して何が嬉しい?
二進数の整数で扱うなら、1000倍より1024倍の方が計算が簡単なんだけど、知らない?
二進化十進数なら話は別だと思うけど。
NCデータがどういう情報かはご存知ですか?
# 相変わらずな御仁だなあ
しりませんが、それが何か?通常、浮動小数点で扱ってる数値データなんでしょ?それを、固定小数点で扱いたい、って話なんでしょ?何か問題でも?
そしてキミからは、具体的には何の反論も出てこない、という相変わらずさじゃ無いといいけど。
NCデータと通常称されるものは、NC工作機械に入力されるテキストデータ。テキストデータなので浮動小数点も固定小数点もない。それを読み取ったCNC側が内部でどう扱っているかは別問題としてあるが、通常外部に公開されていない。
また"G91X1;"と"G91X1.;"が同じ動きをするかどうかは設定次第。よくある設定だと小数点抜きの場合um単位、小数点をつけるとmm単位の指令と解釈される。三菱のCNCなら"#1015 cunit プログラム指令単位"の設定内容を確認する。
そもそも別の設定項目でメトリック系とインチ系が切り換えられたりするから、NCデータ単体では各数値の表す意味は不明。
# 組み込みマクロにSINとかあるけど精度調べたことなかったなあ。# 計算精度より先に位置決め精度のほうが頭打ちになる機械ばかりだしどう確認しよう。
NCデータと通常称されるものは、NC工作機械に入力されるテキストデータ。テキストデータなので浮動小数点も固定小数点もない。
つまり、二進化十進数 [wikipedia.org]ってことね。既に書いた [srad.jp]通り、それなら話は別。
で、機械に食わせる二進化十進数を1000倍して小数点を無くすかずらすかして、何か嬉しいの?小数点以下の0が9個以上連続する、とかなら判らんでもないけど、3個くらいなら人間が手を加えるにしても、大した話じゃ無いと思うけど。
数点抜きの場合um単位、小数点をつけるとmm単位
「um」って、「μm」のこと?そっちの業界では、そー書くの?
そもそも、マイクロメートルを扱えるなら、そうすればいいだけじゃん、と思うけど、違うの?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
にわかな奴ほど語りたがる -- あるハッカー
floatで整数を数えあげちゃいけない@C言語 (スコア:1)
十数年仕事で(アマ時代を入れると20年以上)使っていたのに知らなかったので数日はまった。
バグったコードからエラー原因を簡素化したテストコードは以下。
float型(i)とint型(k)で1ずつ加算していって異なったら
標準エラーに出力。
Re: (スコア:0)
えー常識だと思っていたけどな
計算機イプシロンとかその辺で出てくる話題だと思た
Re: (スコア:0)
計算機的な講義(世代により中学なり大学なり新人研修だったりするだろうけど)でイの一番に習いそうだけど。
Re: (スコア:0)
浮動小数のバックグランドを知らない人間に浮動小数を扱わせてはいけない、の実例。
Re: (スコア:2)
Z80用の単精度浮動小数点ライブラリを自分で書いてみたクチだから、どれくらい浮動小数点での加減算が信用できない(精度が足りなくなる)か身に染みて分かる。
今は浮動小数点形式の構造ばかりか、スタックの構造やらポインタ、果てはデータのメモリ内での記憶方法なんぞを知らなくても良い時代になったと思えばいいのかなあ。
Re: (スコア:0)
今はNCデータが割と身近にある仕事してるんだけど、それに慣れてると、小数はぜんぶ1000倍して常に整数で持たせたくなる。モノはでかくても4mくらいだし。
Re: (スコア:1)
なぜ1024倍でないのか?
Re: (スコア:0)
0.001mm を 1024倍して何が嬉しい?
Re: (スコア:1)
二進数の整数で扱うなら、1000倍より1024倍の方が計算が簡単なんだけど、知らない?
二進化十進数なら話は別だと思うけど。
Re: (スコア:0)
NCデータがどういう情報かはご存知ですか?
# 相変わらずな御仁だなあ
Re: (スコア:1)
NCデータがどういう情報かはご存知ですか?
しりませんが、それが何か?
通常、浮動小数点で扱ってる数値データなんでしょ?
それを、固定小数点で扱いたい、って話なんでしょ?
何か問題でも?
# 相変わらずな御仁だなあ
そしてキミからは、具体的には何の反論も出てこない、という相変わらずさじゃ無いといいけど。
Re:floatで整数を数えあげちゃいけない@C言語 (スコア:2)
NCデータと通常称されるものは、NC工作機械に入力されるテキストデータ。
テキストデータなので浮動小数点も固定小数点もない。
それを読み取ったCNC側が内部でどう扱っているかは別問題としてあるが、
通常外部に公開されていない。
また"G91X1;"と"G91X1.;"が同じ動きをするかどうかは設定次第。
よくある設定だと小数点抜きの場合um単位、小数点をつけるとmm単位の指令と解釈される。
三菱のCNCなら"#1015 cunit プログラム指令単位"の設定内容を確認する。
そもそも別の設定項目でメトリック系とインチ系が切り換えられたりするから、
NCデータ単体では各数値の表す意味は不明。
# 組み込みマクロにSINとかあるけど精度調べたことなかったなあ。
# 計算精度より先に位置決め精度のほうが頭打ちになる機械ばかりだしどう確認しよう。
Re:floatで整数を数えあげちゃいけない@C言語 (スコア:1)
NCデータと通常称されるものは、NC工作機械に入力されるテキストデータ。
テキストデータなので浮動小数点も固定小数点もない。
つまり、二進化十進数 [wikipedia.org]ってことね。
既に書いた [srad.jp]通り、それなら話は別。
で、機械に食わせる二進化十進数を1000倍して小数点を無くすかずらすかして、何か嬉しいの?
小数点以下の0が9個以上連続する、とかなら判らんでもないけど、3個くらいなら人間が手を加えるにしても、大した話じゃ無いと思うけど。
数点抜きの場合um単位、小数点をつけるとmm単位
「um」って、「μm」のこと?
そっちの業界では、そー書くの?
そもそも、マイクロメートルを扱えるなら、そうすればいいだけじゃん、と思うけど、違うの?