1. double _pow(double x, double y)
  2. {
  3. /*
  4. | 【概要】
  5. | 累乗を求める
  6. | 【引数】
  7. | x : 元
  8. | y : 指数
  9. | 【戻り値】
  10. | xのy乗を返す. x と y の値が無効な場合は 0.0 を返す.
  11. */
  12. int itmp;
  13. double dtmp;
  14.  
  15. __asm {
  16. // flg=0;
  17. xor edx, edx
  18. ;
  19. ; if(x==0.0) { // ゼロのy乗でエラー
  20. ;
  21. fld x
  22. ftst
  23. fnstsw ax
  24. sahf
  25. jnz jp1
  26. ;
  27. ; if(y==0.0)
  28. ; return 1.0;
  29. ; else
  30. ; return 0.0;
  31. ;
  32. fld y
  33. ftst
  34. fnstsw ax
  35. sahf
  36. fldz
  37. jnz Rtn
  38. fld1
  39. jmp Rtn
  40. ;
  41. ; }
  42. ;
  43. jp1:
  44. ;
  45. ; if(x<0.0) {
  46. ; x=-x;
  47. ;
  48. jae jp2
  49. fchs
  50. ;
  51. ; if(y==(double)((int)y))
  52. ;
  53. fld y
  54. frndint
  55. fcom y
  56. fnstsw ax
  57. sahf
  58. jne err
  59. ;
  60. ; // フラグセット
  61. ; flg=(int)y&1;
  62. ;
  63. fistp itmp
  64. mov edx, itmp
  65. and edx, 1
  66. jmp jp2
  67. ;
  68. ; // 負の数のy乗(小数点あり)でエラー
  69. ; else
  70. ; return 0.0;
  71. ;
  72. err:
  73. fldz
  74. jmp Rtn
  75. ;
  76. ; }
  77. ;
  78. jp2:
  79. ;
  80. ; if(flg)
  81. ; return -exp(log(x)*y);
  82. ; else
  83. ; return exp(log(x)*y);
  84. ;
  85. fld y
  86. fxch
  87. fyl2x ; log2x^y=m+n m:整数部, n:小数部
  88. fst dtmp
  89. frndint
  90. fld dtmp
  91. fsub st(0), st(1)
  92. fstp dtmp ; dtmp=n, st(0)=n
  93. fld1
  94. fscale
  95. fld dtmp
  96. f2xm1
  97. fld1
  98. fadd st(0), st(1)
  99. fmul st(0), st(2) ; x^y=(x^m)*(x^n)
  100. test edx, edx
  101. jz Rtn
  102. fchs
  103. Rtn:
  104. }
  105. }

タグ:

+ タグ編集
  • タグ:
最終更新:2008年05月31日 20:05