Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2011-10-25

uupaa さんの msgpack.js がパクられてた件

10:29

BadAss JavaScript にこんなのがあって、

I also released CoffeePack, an implementation of the MessagePack serialization format in pure CoffeeScript.

Badass JS is back with a new look! Here’s a little... | Badass JavaScript

おお!?と思ったので見てみたら、

                    # float
                    else
                        # TODO: encode single precision if possible
                        sign = val < 0
                        val *= -1 if sign
                
                        # add offset 1023 to ensure positive
                        exp = ((Math.log(val) / Math.LN2) + 1023) | 0
                
                        # shift 52 - (exp - 1023) bits to make integer part exactly 53 bits,
                        # then throw away trash less than decimal point
                        frac = val * Math.pow(2, 52 + 1023 - exp)
                
                        low = frac & 0xffffffff
                        exp |= 0x800 if sign
                        high = ((frac / 0x100000000) & 0xfffff) | (exp << 20)
                
                        bytes.push 0xcb, (high >> 24) & 0xff, (high >> 16) & 0xff,
                                         (high >>  8) & 0xff,  high        & 0xff,
                                         (low  >> 24) & 0xff, (low  >> 16) & 0xff,
                                         (low  >>  8) & 0xff,  low         & 0xff

なんか見覚えが…

前に書いた IEEE754 のコードに酷似してる。

というか uupaa さんの msgpack.js ↓とコメント含めて同じなんですけど><

            } else { // double
                // THX!! @edvakf
                // http://javascript.g.hatena.ne.jp/edvakf/20101128/1291000731
                sign = mix < 0;
                sign && (mix *= -1);

                // add offset 1023 to ensure positive
                // 0.6931471805599453 = Math.LN2;
                exp  = ((Math.log(mix) / 0.6931471805599453) + 1023) | 0;

                // shift 52 - (exp - 1023) bits to make integer part exactly 53 bits,
                // then throw away trash less than decimal point
                frac = mix * Math.pow(2, 52 + 1023 - exp);

                //  S+-Exp(11)--++-----------------Fraction(52bits)-----------------------+
                //  ||          ||                                                        |
                //  v+----------++--------------------------------------------------------+
                //  00000000|00000000|00000000|00000000|00000000|00000000|00000000|00000000
                //  6      5    55  4        4        3        2        1        8        0
                //  3      6    21  8        0        2        4        6
                //
                //  +----------high(32bits)-----------+ +----------low(32bits)------------+
                //  |                                 | |                                 |
                //  +---------------------------------+ +---------------------------------+
                //  3      2    21  1        8        0
                //  1      4    09  6
                low  = frac & 0xffffffff;
                sign && (exp |= 0x800);
                high = ((frac / 0x100000000) & 0xfffff) | (exp << 20);

                rv.push(0xcb, (high >> 24) & 0xff, (high >> 16) & 0xff,
                              (high >>  8) & 0xff,  high        & 0xff,
                              (low  >> 24) & 0xff, (low  >> 16) & 0xff,
                              (low  >>  8) & 0xff,  low         & 0xff);
            }
            break;

issue 作ってみた。


修正された。

本当なら Copyright のところに連名にするべきだろうけど、(The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.)自分としてはこれで十分なのでもういい。


本当なら自分のコードはパブリックドメインにしてもいいと思ってるんだけど、今回は自分だけのコードじゃなかったのでかっとなった。良いコードはパクられる、と思えば気にならない。

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20111025
 |