「この地域一帯でエコキュートの工事をするので説明に来た」と。
近所は新築戸建を建てたりしていて工事で道がふさがるだのなんだのあるので、その類の説明かと思ったらセールスだったでござる。
東電の担当が直々に来たわけでもなく工事会社だったようなんだが (調べてないけどひ孫請けくらいなのかしら。関電工みたいなメジャーなところではなかったし、セールスの要領も非常に悪かったし)、 別会社で2回同じ日に来るとかいう。いわく
東電必死だなw
しかし、詐欺臭さすら感じるひどい説明だった。 電気代が上がるとか言うのにエコキュートが売れるとはとても思えないから、正攻法ではセールスの成果が上がらないんだろうけどさ。
先週の日曜日に Verilog 初心者講習会に侵入してきた。
DE0 という FPGA キットを使って Verilog のお勉強する会です。

ちなみに画像のDE0 は別売りの LCD パネルを搭載しています。 この LCD パネルを取り付けるには、はんだ付けしないといけないので、 買う時には注意しましょう。
うちから行くと直線距離では近いにもかかわらず何故か1時間以上かかるという、私にとっては微妙に不便な場所。

集まった人のレベルがよくわからなかったけど、 もう少しレベル上げた形にするとか、 Q&A形式メインとかにしても問題なかったのやもしれないような気が。 (そもそもキットを買ってやろうという意思のある人らだしな)
参加者の自己紹介なんかはなかったし、特に交流はなかったという。 講師の千本木さんは、フリースケールセミコンダクタ(旧モトローラの半導体部門)にいたひと(今は別の会社に移っているとのこと)。
テキストはこれ

前半は座学パート、後半は実習パート。 千本木さんはほぼ間違いなく昔ゲート設計者だった人。 ぐぐると画像処理系のLSI作ってたんかなとも思うけれど。
確かにこれはソフト屋さんからすると驚くことかもしれんな。
買って何に使うんだというのを考えずに買ってみた。 開発元の Terasic から直接買ったけれど 送料がかかるんで、 (7500円以上で)送料がかからない DigiKeyから買うのが最安。
紙のマニュアルはないので、 添付CD-ROMの中の Getting(略)pdf ファイルを読む。 が、とりあえず Quartas II (とNeosII EDS) を入れやがれ、という。 Education board の割に不親切な説明だなこれは。
念のため User Manual を読むと、
こっちを先に読めということらしい。
ツールを入れる前にスタンドアロンで動かせるらしい。ので、 AC アダプタを接続して赤い電源ボタンを押す。動く。 (電源を入れる前に、左端にあるスライドスイッチが「RUN」位置にあることを確認する。PROG になっていたら RUN に切り替えておく)
VGA ケーブルとモニタがあればつなげると何か映るらしいが未確認。
添付 CD-ROM に入っているのはバージョンが古い(& Windows 版しかない) ので、 Altera からダウンロードする。個人情報を記入する必要があるが。
6GB くらいディスクスペースが必要。
Quartus2 のインストール先のフォルダの中に、 USB Blaster (II もあるけど DE0 は初代のほう) のドライバがあるので これをインストールする必要がある。 USB ケーブルを接続して DE0 の電源を入れると PC から DE0 を認識 するので、主導でドライバを入れる。
添付CD-ROM のフォルダごとコピー。 そのままだとなぜかDLL不足というか、QuartusIIのインストールディレクトリが見えない(ってそうか、添付CD-ROMとバージョンが違うからだ)ためにうまく立ち上がらない。
QuartusII の bin ディレクトリにある
jtag_client.dll dinkun_alt.dll (とdinkun_alt.pdb)
をコピーすることで動作するようになった。
ということで、log(0) は EDOM でも ERANGE でもいいっぽいですねえ
違うよ、それは違うよ。Sun コンパイラが言っているのは、要するに
であって、SVID 指定なら EDOM だし、X/Open 指定なら ERANGE、です (デフォルトは X/Open)。 どっちも原規格にあたっていないので、shall なのか should なのか知りませんけど。
log(0.0) の結果を printf で表示するようにして、 指定によって変わる様を示しておきます。
% cat log.c
#include <math.h>
#include <errno.h>
#include <stdio.h>
int main(int ac, char **av)
{
double d;
d=log(0.0);
perror("");
printf("%d\n", errno);
printf("%f\n", d);
}
% cc -lm -Xt log.c % a.out log: SING error Argument out of domain 33 -340282346638528859811704183484516925440.000000
% cc -lm -Xa log.c % a.out Result too large 34 -Inf
他に関係する規格の規定はこんな感じ、
したがって、環境がどの規格に準拠しているのかで、定義域エラーになるか値域エラーになるかが違うワケです。が、定義域エラーになるのはめずらしいような。
なお、どれでも、log(-1) は定義域エラーです。
python の元の問題を試してみたのさ。
import math
for x in range(0, 10):
z = 10 ** int(math.log10(x))
if x > z and x % z:
continue
print(x)
さっきと同じ環境だと
% python log.py
Traceback (most recent call last):
File "log.py", line 3, in <module>
z = 10 ** int(math.log10(x))
OverflowError: math range error
ふむ。さっきの log(0.0) の結果 (-Xa) と同じ。
別の環境
% gcc -lm log.c % a.out Numerical result out of range 29 -inf
おっと、errno が上書きされてる。perror() と errno 表示をひっくりかえすと
% a.out 34 Numerical result out of range -inf
この環境で、
% python log.py
Traceback (most recent call last):
File "log.py", line 3, in <module>
z = 10 ** int(math.log10(x))
ValueError: math domain error
Huh? お前は何をいっているのだ? ちなみに ruby だとおかしなことにはなっていない。
% ruby -e 'print Math.log(0.0)'
-e:1:in `log': Numerical result out of range - log (Errno::ERANGE)
from -e:1
Float → Double の代入を行って「誤差が発生する」ケースってどんなのでしょうか?
IEEE754規格 (5.4.2節) では
Conversion to a format with the same radix but wider precision and range is always exact.
なので誤差は発生しませんね。Scala の実装は知りませんケド :-p
ゴルフコンペはとりあえず二桁台に乗ったので満足。 今日追い抜かれない限り更新する努力はしない予定...
(追記)ぬかれたので頑張る...実行時間が全然違うな...
バイト単位でコピーするアホなコードの方が、勝手にベクトル化される分、gcc 内蔵のヤツより最大3倍高速なんだってwww
手元の glibc memcpy() だとこんなコードですが、 そもそも SSE2 を使わない縛りとしても最速コードではなさげ。
008bb6d0 <memcpy>: 8bb6d0: 8b 4c 24 0c mov 0xc(%esp),%ecx 8bb6d4: 89 f8 mov %edi,%eax 8bb6d6: 8b 7c 24 04 mov 0x4(%esp),%edi 8bb6da: 89 f2 mov %esi,%edx 8bb6dc: 8b 74 24 08 mov 0x8(%esp),%esi 8bb6e0: fc cld 8bb6e1: d1 e9 shr %ecx 8bb6e3: 73 01 jae 8bb6e6 <memcpy+0x16> 8bb6e5: a4 movsb %ds:(%esi),%es:(%edi) 8bb6e6: d1 e9 shr %ecx 8bb6e8: 73 02 jae 8bb6ec <memcpy+0x1c> 8bb6ea: 66 a5 movsw %ds:(%esi),%es:(%edi) 8bb6ec: f3 a5 rep movsl %ds:(%esi),%es:(%edi) 8bb6ee: 89 c7 mov %eax,%edi 8bb6f0: 89 d6 mov %edx,%esi 8bb6f2: 8b 44 24 04 mov 0x4(%esp),%eax 8bb6f6: c3 ret
Intel としてはコンパイラの性能自慢のために、 自分らの過去のコードよりもインパクトのある数字だから 持ってきたんだろうなぁ。
_ うんの [算数.org の方にもメールしましたが、明日は休講になりました。 ゆっくり休んでくださいませ。]