トップ回答者
System.Mathを省略してSinだけで使うことは出来ない?

質問
回答
すべての返信
-
System.Mathをsmと略したaliasにして、sm.Sin、sm.Logなどのように標記することにしました。
ところで・・・、以下、余談ながら疑問に感じたことを、
System.Mathというクラスがあって、三角関数や対数などのメソッドが用意されていて・・・、使うことには不自由しないのですが、これって、MSILにコンパイルされたときには、たぶん、クラスのメソッドを呼び出すような表現になっていると想像しています。で、実行の直前にJITコンパイルされてNativeになるときには・・・、最適な数のFPU命令で演算できるようにインラインで展開されるんでしょうねぇ?
あとで、確認しようと思いますが・・・。
-
自己レスです。一応、私の環境(Windows XP、.Net Framework 2.0、C#で書いたものを混合モードでデバッグ)では、
-
三角関数のSinは、直にIA32のFSIN命令に展開されますが、CosやTanはどこか別の場所をCALLするようです。これは、ちょっと不可解・・・。Sinを基に、自分でCosやTanの計算を書き下した方が速くなるかも・・・。
-
AbsやSqrtはIA32の命令に展開されます。
-
Log、Log10、Expは別の場所をCALLするが、これは、IA32の対数や指数の命令と底が異なり換算が必要だから、まぁ、納得できる。
という感じでした。参考まで。
-
C#で使える手法として、正の値の場合、doubleの数値に対してFloorを使うよりは、一度intにキャストしてdoubleに戻したほうが速い。(これは、VBでは使えない。Cintで勝手な丸め操作が行われる故)
-
-
型を省略されるのは嫌いだけど、数学的な部分だけは可読性上がるから省略したくなりますね。
delegate使ってもできます。どっちが早いかは知りませんが^^;
Code Snippetdelegate double TrigonometricFunction(double x);
class Sample
{
private static readonry TrigonometricFunction Sin = Math.Sin;
private static readonry TrigonometricFunction Cos = Math.Cos;
public void Test(double x)
{
double val = Cos(Sin(x));
}
とりあえず、delegateだとSin,Cosの中身がTest内に展開されないのだけは確実か。