アカウント名:
パスワード:
十数年仕事で(アマ時代を入れると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倍の方が計算が簡単なんだけど、知らない?
二進化十進数なら話は別だと思うけど。
いまどきこんなこと言ってる人いるんだなあw $ cat test.cint hoge(int n){ return 1024 * n;}
int piyo(int n){ return 1000 * n;}
$ gcc -O2 -S test.c -o - .text .globl hogehoge: movl %ecx, %eax sall $10,
えっと、IA-32命令 [intel.co.jp]で恐縮ですが、1024倍のほうは 0.5+4に対して、1000倍は14のレイテンシってことでいいのかな?たいぶ差が縮まったとはいえ、まだ3倍ほど"1024 * n"のほうが簡単だよね。
えっと、IA-32命令 [intel.co.jp]で恐縮ですが、1024倍のほうは 0.5+4に対して、1000倍は14のレイテンシってことでいいのかな?
いまどき「各表には、Intel Pentium 4 プロセッサに固有のデータを記載した。」なんて書かれてるドキュメントの数値を挙げてドヤ顔とは恐れ入ります。
「顧客も自分が使っているCPUと同程度のものを使っているはず」って思い込める環境っていいよね。何のためにコンパイラがわざわざ2のべき乗の場合はシフト命令を吐くのか、みたいな思いなんていらないもんね。IA-32命令を挙げたのはそれしか86系CPUで命令毎の情報が見つからなかったからで、「○○以降なら乗算とシフトとは同じ速度で演算できる」っていうのが示せるんだったら出して欲しい。
#仕事ではARMを使っているけど、ダイに入りきらなかったのか乗算器は積んでいない環境なんですよ。
ARMはARM2の頃から使ってるけど乗算で苦労した記憶はないなあ。ARMって何使ってんの?
古いほうはARM7だったかな?SoCなので更新もなかなかできず両方現役です。ASIC部分が大きくて高速乗算器を諦めたと推定しています。設計者に聞いたわけではないので本当のところは判りませんが、サイズがキツいのは確かですから。苦労っていうより、単にスケーリングする時のような1000倍でも1024
古いほうはARM7だったかな?SoCなので更新もなかなかできず両方現役です。ASIC部分が大きくて高速乗算器を諦めたと推定しています。設計者に聞いたわけではないので本当のところは判りませんが、サイズがキツいのは確かですから。
ARM7? MUL命令やMLA命令は普通に使えた時代ですね。正直言って何言ってんのという感じだけど、それか、レベルの低い職場なんだなあ、としか。
MUL命令自体はありますよ。それが高速乗算器を使うか反復乗算器を使うかはSoCにするときの実装しだいってことです。
苦労っていうより、単にスケーリングする時のような1000倍でも1024倍でもいいような用途に、何も気にせず"n*1000"って書く奴にがっくりするんですよ。少なくとも、何万回も廻すループで使われないかとかは気にして欲しいし、「後で逆変換でスケーリングした分を除算するかもしれない」とくらいは考慮しておいて欲しいものです。(まあ、大きいほうにスケーリングすることはそう無いと思いますが)
0.001mm を 1000倍して整数の 1 として扱いたいって話について何言ってんの?
より多くのコメントがこの議論にあるかもしれませんが、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)
二進数の整数で扱うなら、1000倍より1024倍の方が計算が簡単なんだけど、知らない?
いまどきこんなこと言ってる人いるんだなあw
$ cat test.c
int hoge(int n)
{
return 1024 * n;
}
int piyo(int n)
{
return 1000 * n;
}
$ gcc -O2 -S test.c -o -
.text
.globl hoge
hoge:
movl %ecx, %eax
sall $10,
Re: (スコア:0)
えっと、IA-32命令 [intel.co.jp]で恐縮ですが、1024倍のほうは 0.5+4に対して、1000倍は14のレイテンシってことでいいのかな?
たいぶ差が縮まったとはいえ、まだ3倍ほど"1024 * n"のほうが簡単だよね。
Re: (スコア:0)
えっと、IA-32命令 [intel.co.jp]で恐縮ですが、1024倍のほうは 0.5+4に対して、1000倍は14のレイテンシってことでいいのかな?
いまどき「各表には、Intel Pentium 4 プロセッサに固有のデータを記載した。」なんて書かれてるドキュメントの数値を挙げてドヤ顔とは恐れ入ります。
Re: (スコア:0)
いまどき「各表には、Intel Pentium 4 プロセッサに固有のデータを記載した。」なんて書かれてるドキュメントの数値を挙げてドヤ顔とは恐れ入ります。
「顧客も自分が使っているCPUと同程度のものを使っているはず」って思い込める環境っていいよね。
何のためにコンパイラがわざわざ2のべき乗の場合はシフト命令を吐くのか、みたいな思いなんていらないもんね。
IA-32命令を挙げたのはそれしか86系CPUで命令毎の情報が見つからなかったからで、「○○以降なら乗算とシフトとは同じ速度で演算できる」っていうのが示せるんだったら出して欲しい。
#仕事ではARMを使っているけど、ダイに入りきらなかったのか乗算器は積んでいない環境なんですよ。
Re:floatで整数を数えあげちゃいけない@C言語 (スコア:0)
#仕事ではARMを使っているけど、ダイに入りきらなかったのか乗算器は積んでいない環境なんですよ。
ARMはARM2の頃から使ってるけど乗算で苦労した記憶はないなあ。ARMって何使ってんの?
Re: (スコア:0)
#仕事ではARMを使っているけど、ダイに入りきらなかったのか乗算器は積んでいない環境なんですよ。
ARMはARM2の頃から使ってるけど乗算で苦労した記憶はないなあ。ARMって何使ってんの?
古いほうはARM7だったかな?SoCなので更新もなかなかできず両方現役です。ASIC部分が大きくて高速乗算器を諦めたと推定しています。設計者に聞いたわけではないので本当のところは判りませんが、サイズがキツいのは確かですから。
苦労っていうより、単にスケーリングする時のような1000倍でも1024
Re: (スコア:0)
古いほうはARM7だったかな?SoCなので更新もなかなかできず両方現役です。ASIC部分が大きくて高速乗算器を諦めたと推定しています。設計者に聞いたわけではないので本当のところは判りませんが、サイズがキツいのは確かですから。
ARM7? MUL命令やMLA命令は普通に使えた時代ですね。正直言って何言ってんのという感じだけど、それか、レベルの低い職場なんだなあ、としか。
Re: (スコア:0)
MUL命令自体はありますよ。それが高速乗算器を使うか反復乗算器を使うかはSoCにするときの実装しだいってことです。
Re: (スコア:0)
苦労っていうより、単にスケーリングする時のような1000倍でも1024倍でもいいような用途に、何も気にせず"n*1000"って書く奴にがっくりするんですよ。少なくとも、何万回も廻すループで使われないかとかは気にして欲しいし、「後で逆変換でスケーリングした分を除算するかもしれない」とくらいは考慮しておいて欲しいものです。(まあ、大きいほうにスケーリングすることはそう無いと思いますが)
0.001mm を 1000倍して整数の 1 として扱いたいって話について何言ってんの?