トップ «前の日記(2009年08月31日) 最新 次の日記(2009年09月08日)» 編集

Masa's blog

検索キーワード:

2009年09月02日 午後のコーダのコンパイルエラー & 浮動小数点演算例外です [長年日記]

_ 午後のコーダのコンパイルエラー & 浮動小数点演算例外です

Slackware-12.2午後のコーダをインストールした時のメモ。

まず普通にビルドしてみる。

で、エラー発生。

engine/i386/fftsse.nas:26: error: invalid character in floating-point constant exponent: 'F'
make: *** [fftsse.o] エラー 1

アセンブラ(nasm)の仕様変更っぽい。対策は以下。

diff -cr petit313.ORG/engine/i386/fftsse.nas petit313/engine/i386/fftsse.nas
*** petit313.ORG/engine/i386/fftsse.nas	Sun Oct  5 09:50:37 2003
--- petit313/engine/i386/fftsse.nas	Wed Sep  2 10:56:40 2009
***************
*** 23,36 ****
  Q_SQRT2	dd	1.41421356237, 1.41421356237, 1.41421356237, 1.41421356237

  Q_1		dd	1.0, 1.0, 1.0, 1.0
! costab	dd	9.238795325112867e-01F, 9.238795325112867e-01F, 9.238795325112867e-01F, 9.238795325112867e-01F
! 		dd	3.826834323650898e-01F, 3.826834323650898e-01F, 3.826834323650898e-01F, 3.826834323650898e-01F
! 		dd	9.951847266721969e-01F, 9.951847266721969e-01F, 9.951847266721969e-01F, 9.951847266721969e-01F
! 		dd	9.801714032956060e-02F, 9.801714032956060e-02F, 9.801714032956060e-02F, 9.801714032956060e-02F
! 		dd	9.996988186962042e-01F, 9.996988186962042e-01F, 9.996988186962042e-01F, 9.996988186962042e-01F
! 		dd	2.454122852291229e-02F, 2.454122852291229e-02F, 2.454122852291229e-02F, 2.454122852291229e-02F
! 		dd	9.999811752826011e-01F, 9.999811752826011e-01F, 9.999811752826011e-01F, 9.999811752826011e-01F
! 		dd	6.135884649154475e-03F, 6.135884649154475e-03F, 6.135884649154475e-03F, 6.135884649154475e-03F

  	align	32
  revLongInit	db 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80
--- 23,36 ----
  Q_SQRT2	dd	1.41421356237, 1.41421356237, 1.41421356237, 1.41421356237

  Q_1		dd	1.0, 1.0, 1.0, 1.0
! costab	dd	9.238795325112867e-01, 9.238795325112867e-01, 9.238795325112867e-01, 9.238795325112867e-01
! 		dd	3.826834323650898e-01, 3.826834323650898e-01, 3.826834323650898e-01, 3.826834323650898e-01
! 		dd	9.951847266721969e-01, 9.951847266721969e-01, 9.951847266721969e-01, 9.951847266721969e-01
! 		dd	9.801714032956060e-02, 9.801714032956060e-02, 9.801714032956060e-02, 9.801714032956060e-02
! 		dd	9.996988186962042e-01, 9.996988186962042e-01, 9.996988186962042e-01, 9.996988186962042e-01
! 		dd	2.454122852291229e-02, 2.454122852291229e-02, 2.454122852291229e-02, 2.454122852291229e-02
! 		dd	9.999811752826011e-01, 9.999811752826011e-01, 9.999811752826011e-01, 9.999811752826011e-01
! 		dd	6.135884649154475e-03, 6.135884649154475e-03, 6.135884649154475e-03, 6.135884649154475e-03

  	align	32
  revLongInit	db 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80
  • make
  • make install

でインストールは完了。

gogo input.wav output.mp3

みたいに実行すると、「浮動小数点演算例外です」のエラーで異常終了する。

gogo 浮動小数点演算例外です で検索すると、

./configure --enable-debug && make && make install

でインストールすると正常に動くとの情報を得る。しかし必要も無いのに --enable-debug を付けるのはやはり気持悪いので、別の対策を考えた。

で、おそらくgccの最適化の問題であろうと推測して、以下のようにコンパイルオプションを修正してみたら、うまく行った。

diff -cr petit313.ORG/configure petit313/configure
*** petit313.ORG/configure	Sun May 23 01:07:58 2004
--- petit313/configure	Wed Sep  2 11:01:52 2009
***************
*** 1346,1352 ****
  		;;
  	*)
  		# default
! 		OPTIMIZATION="-O3 -fomit-frame-pointer -ffast-math \
  			-funroll-loops"
  		;;
  	esac
--- 1346,1352 ----
  		;;
  	*)
  		# default
! 		OPTIMIZATION="-O -fomit-frame-pointer \
  			-funroll-loops"
  		;;
  	esac

最初、-ffast-mathだけを外して、うまく行くかに思えたが、何度か実行していると「浮動小数点演算例外です」が出るようになってしまった。そこで-O3-Oにして、最適化を遠慮がちにすると安定した。

おそらく上記の対応ではエンコーディングが本来の速度より遅くなると思われるが、動かん事には仕方が無いので...。

上記の修正を加えた後に、当然 ./configure からビルドし直す。