GCC Wikia
Advertisement

このページを編集する際は,編集に関する方針に従ってください.[]

概要[]

引数[]

実装[]

 796 /* Calculate R = A / B.  Return true if the result may be inexact.  */
797 
798 static bool
799 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
800            const REAL_VALUE_TYPE *b)
801 {
802   int exp, sign = a->sign ^ b->sign;
803   REAL_VALUE_TYPE t, *rr;
804   bool inexact;
805 

~
~

806   switch (CLASS2 (a->cl, b->cl))
807     {

*割ったらNot a Numberになるパターン

808     case CLASS2 ([[rvc_zero>enum real_value_class]], [[rvc_zero>enum real_value_class]]):
 809       /* 0 / 0 = NaN.  */
810     case CLASS2 ([[rvc_inf>enum real_value_class]], [[rvc_inf>enum real_value_class]]):
 811       /* Inf / Inf = NaN.  */
812       get_canonical_qnan (r, sign);
813       return false;
814 

*割ったら0になるパターン

815     case CLASS2 ([[rvc_zero>enum real_value_class]], [[rvc_normal>enum real_value_class]]):
816     case CLASS2 ([[rvc_zero>enum real_value_class]], [[rvc_inf>enum real_value_class]]):
 817       /* 0 / ANY = 0.  */
818     case CLASS2 ([[rvc_normal>enum real_value_class]], [[rvc_inf>enum real_value_class]]):
 819       /* R / Inf = 0.  */
820       get_zero (r, sign);
821       return false;
822 

*割ったら無限になるパターン

823     case CLASS2 ([[rvc_normal>enum real_value_class]], [[rvc_zero>enum real_value_class]]):
 824       /* R / 0 = Inf.  */
825     case CLASS2 ([[rvc_inf>enum real_value_class]], [[rvc_zero>enum real_value_class]]):
 826       /* Inf / 0 = Inf.  */
827       get_inf (r, sign);
828       return false;
829 

*割ったら割る数と同じになるパターン
**符号は変わるかもしれない

830     case CLASS2 ([[rvc_zero>enum real_value_class]], [[rvc_nan>enum real_value_class]]):
831     case CLASS2 ([[rvc_normal>enum real_value_class]], [[rvc_nan>enum real_value_class]]):
832     case CLASS2 ([[rvc_inf>enum real_value_class]], [[rvc_nan>enum real_value_class]]):
833     case CLASS2 ([[rvc_nan>enum real_value_class]], [[rvc_nan>enum real_value_class]]):
 834       /* ANY / NaN = NaN.  */
835       *r = *b;
836       r->sign = sign;
837       return false;
838 

*割ったら割られる数と同じになるパターン
**符号は変わるかもしれない

839     case CLASS2 ([[rvc_nan>enum real_value_class]], [[rvc_zero>enum real_value_class]]):
840     case CLASS2 ([[rvc_nan>enum real_value_class]], [[rvc_normal>enum real_value_class]]):
841     case CLASS2 ([[rvc_nan>enum real_value_class]], [[rvc_inf>enum real_value_class]]):
 842       /* NaN / ANY = NaN.  */
843       *r = *a;
844       r->sign = sign;
845       return false;
846 

*割ったら無限になるパターン
**上の同様のパターンと一緒にできそう

847     case CLASS2 ([[rvc_inf>enum real_value_class]], [[rvc_normal>enum real_value_class]]):
 848       /* Inf / R = Inf.  */
849       get_inf (r, sign);
850       return false;
851 
852     case CLASS2 ([[rvc_normal>enum real_value_class]], [[rvc_normal>enum real_value_class]]):
853       break;
854 
855     default:
856       gcc_unreachable ();
857     }
858 

~
~

859   if (r == a || r == b)
860     rr = &t;
861   else
862     rr = r;
863 
 864   /* Make sure all fields in the result are initialized.  */
865   get_zero (rr, 0);
866   rr->cl = [[rvc_normal>enum real_value_class]];
867   rr->sign = sign;
868 

~
*指数が極端な値になってしまう

869   exp = REAL_EXP (a) - REAL_EXP (b) + 1;
870   if (exp > MAX_EXP)
871     {
872       get_inf (r, sign);
873       return true;
874     }
875   if (exp < -MAX_EXP)
876     {
877       get_zero (r, sign);
878       return true;
879     }
880   SET_REAL_EXP (rr, exp);
881 

~
*仮数部同士の割り算

882   inexact = div_significands (rr, a, b);
883 

*正規化

 884   /* Re-normalize the result.  */
885   normalize (rr);
886   rr->sig[0] |= inexact;
887 
888   if (rr != r)
889     *r = t;
890 
891   return inexact;
892 }


リンク元

Advertisement