パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

スラドに聞け:いま使っている言語の仕様、把握している?」記事へのコメント

  • 十数年仕事で(アマ時代を入れると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;
    }

    • by Anonymous Coward

      えー常識だと思っていたけどな
      計算機イプシロンとかその辺で出てくる話題だと思た

      • by Anonymous Coward

        計算機的な講義(世代により中学なり大学なり新人研修だったりするだろうけど)でイの一番に習いそうだけど。

        • by Anonymous Coward

          浮動小数のバックグランドを知らない人間に浮動小数を扱わせてはいけない、の実例。

          • Z80用の単精度浮動小数点ライブラリを自分で書いてみたクチだから、どれくらい浮動小数点での加減算が信用できない(精度が足りなくなる)か身に染みて分かる。
            今は浮動小数点形式の構造ばかりか、スタックの構造やらポインタ、果てはデータのメモリ内での記憶方法なんぞを知らなくても良い時代になったと思えばいいのかなあ。

            • by Anonymous Coward

              今はNCデータが割と身近にある仕事してるんだけど、それに慣れてると、小数はぜんぶ1000倍して常に整数で持たせたくなる。モノはでかくても4mくらいだし。

              • なぜ1024倍でないのか?

              • by Anonymous Coward

                0.001mm を 1024倍して何が嬉しい?

              • 二進数の整数で扱うなら、1000倍より1024倍の方が計算が簡単なんだけど、知らない?

                二進化十進数なら話は別だと思うけど。

              • by Anonymous Coward

                二進数の整数で扱うなら、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,

              • これて浮動小数点で得られるものを、固定小数点で表したい、ってはなしだよね。
                なら、

                int hoge(double n)
                {
                  return 1024 * (int)n;
                }
                 
                int piyo(double n)
                {
                  return 1000 * (int)n;
                }

                とかにしないと。

                掛け算しようとすると、固定小数点なので、

                int hogemul(int n, int m)
                {
                  return ((long)n * (long)m)/1024;
                }
                 
                int piyomul(int n, int m)
                {
                  return ((long)n * (long)m)/1000;
                }

              • by Anonymous Coward

                > return 1024 * (int)n;
                ではなくて、

                  return (int)(1024.0 * n);

                ではないの?だとしたら1024でも1000でも計算コストは変わらないよね。

                > 掛け算しようとすると、固定小数点なので、
                > return ((long)n * (long)m)/1024;

                これも、掛け算したらもはや単位は長さではなく面積なので、
                長さ 1unit=1/1,000 mm
                面積 1unit=1/1,000,000 mm2
                と仕様書に書いておけばすむ話。

                いずれにしても、僅かな計算機リソースの節減より、
                十進にしたときの見やすさを優先するなあ。私だったら。

              • ではないの?だとしたら1024でも1000でも計算コストは変わらないよね。

                1024 * (int)nだろうと、(int)(1024.0 * n)だろうと、1024倍と1000倍でコストは変わらないね。
                実際、どちらの場合も、コンパイラが吐くニーモニックのステップ数は同じになる。

                ただし、掛算とビットシフトが同じコストと考えるならば、だけどね。
                実際には同じではないので、コンパイラも1024倍の時は、掛算命令でなくビットシフト命令を吐くわけだけど。

                これも、掛け算したらもはや単位は長さではなく面積なので、
                長さ 1unit=1/1,000 mm
                面積 1unit=1/1,000,000 mm2
                と仕様書に書いておけばすむ話。

                そんなことで済むなら、そもそも#3069125 [srad.jp]は何だったのか、って話になっちゃうね。

                それにもし、そうしたいのであれば、普通

              • by Anonymous Coward

                > コンパイラも1024倍の時は、掛算命令でなくビットシフト命令を吐く

                (int)(1024.0 * n)って、ビットシフトで計算するんですか?自分のところのVisualStudioではどちらもfmul命令に変換されたんですが。

                > マイクロメートル、学校で習ったよね?

                業界によりますが、長さをmmで扱うのが当然のところでは、1000mmを単純に1mと略さないのと同じ程度には、0.001mmを単純に1μmと書かないところがあります。

                > そもそも、機械に食わせるデータに、見やすさなんか関係あるの?

                思った結果にならなかったときに、生データをその場で当たらなければならないことは往々にしてるんですよ。

              • intの1024倍はビットシフトですが、floatの1024.0倍は(型変換を除けば)整数の足し算で表現できますよねっ
                # IEEE754脳のまぜっかえし
              • by Anonymous Coward on 2016年08月26日 13時11分 (#3070271)

                floatの値から指数部を取り出して10を足し、floatの取りうる指数の範囲を超えていないかを判定、超えていなければfloatの値の指数部を書き換え、超えていれば無限大(指数部を255、仮数部を0)に書き換え、という手順になると思うけど、浮動小数点数が扱えるプロセッサなら素直に1024.0倍した方が早いと思うよ。

                親コメント

アレゲはアレゲを呼ぶ -- ある傍観者

処理中...