220だけど、Intel C/C++ Compilerでビットレートがおかしくなる
現象の対処法、やっと発見したよヽ(´ー`)ノ
psy.cの300行目付近の
inthalfoc=(int)halfoc;
を
inthalfoc=(int)floor(halfoc);
に変更すべし(´ー`)y-~~~~
インテルぢゃ無くても浮動小数点数→整数変換で、
切り捨てぢゃ無くて近似値にする一部のコンパイラで効果あり。
見つけるのに3時間かかったよΣ( ̄▽ ̄;)
それ、そもそもANSIに従ってないIntelのコンパイラも変だが、
ソースに変更を加えるよりもFPUコントロールレジスタいじったほうが
よくない?
>>228 インテルでも設定でANSI標準の切り捨てに変更できるけど、
x87の場合近似値がデフォルトだから、切り捨てにすると遅くなる。
あと、Oggのソースはほとんどはそういうコンパイラも考慮されているのか、
切り捨てなければいけないところはちゃんとfloor()関数使って
明示的に切り捨ててるから。
たぶん、今回のところは、開発中なので面倒だったのか、忘れただけなのかで
floor()が使われてないだけ。
他に使われてないところも3箇所くらいしかない。
つーことで納得した?(・ロ・
ごめんつっこみたくなっちゃった(^^) 許してくださいね。
> インテルでも設定でANSI標準の切り捨てに変更できるけど、
>x87の場合近似値がデフォルトだから、切り捨てにすると遅くなる。
その「デフォルト」とやらをANSIのような切り捨てモード(0方向への丸め)
にすればいいって228は言ってるんじゃないでしょうか。fist/fistpがそのままで
ANSI準拠になるモードに最初からしておけばよいと。
vorbisfile.cでは似たようなことをやってますよね。
だったらコントロールワード切り替えに必要なタイムロスは無くなるから。
>Oggのソース
Vorbisのソースですね。Oggの方は浮動小数点演算使ってないから。
> 切り捨てなければいけないところはちゃんとfloor()関数使って
まさかLilithの作者さんたる人がわかってて書いてるとは思うけど、
floorは小数点以下切り捨てじゃないし、通常の=演算子がやるような
double(float)->integer変換とは違いますので・・・
> 他に使われてないところも3箇所くらいしかない。
5カ所以上はありますよ。
floorのやることと=演算子のやることが違うからわざわざfloorを使って
書いてあるんであって、忘れたとかじゃないと思います。
っつーことで納得しました?(笑)
>>228 僕は不安です。
231 :
age:2001/06/09(土) 19:45 ID:???
age
232 :
228:2001/06/09(土) 22:17 ID:???
230さんフォローどうもっす。
intelのコンパイラは実数->整数の暗黙の変換の際は標準でfld/fistpの
組を生成して、ANSI準拠のオプションをつけると、いちいちその都度
コントロールレジスタを切り替えるようなコードを生成するそうな。
だったらオプションをつけずに最初からコントロールレジスタを0方向
への丸めに設定しておけばどうよ、という話なんだな。
>インテルでも設定でANSI標準の切り捨てに変更できるけど、
>x87の場合近似値がデフォルトだから、切り捨てにすると遅くなる。
floor使うのとどっこいどっこいだと思うけど違う?
だいたいあなたの論でいうとANSI切り捨てモードにして影響を
受けるのは3カ所ぐらいしかないんでしょ?(笑)
>つーことで納得した?(・ロ・
うーん、納得できなかったよ(藁)おまけに説教までされちった。
使ってる顔文字とか口調もそうだけど、万が一「こいつは俺を見下して
る」と相手に思われると損だから気をつけた方がいいと思いますよ >
Northern Verse さん