このページを編集する際は,編集に関する方針に従ってください.[]
概要[]
- gcc-4.1.0/gcc/real.cにて定義
- 整数型から浮動小数点型へ
引数[]
- REAL_VALUE_TYPE *r
- enum machine_mode mode
- unsigned HOST_WIDE_INT low
- HOST_WIDE_INT high
- int unsigned_p
実装[]
1960 /* Initialize R from the integer pair HIGH+LOW. */
HIGHとLOWのペアから浮動小数点の初期化
1961
1962 void
1963 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
1964 unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
1965 int unsigned_p)
1966 {
~
*0ならばget_zeroですむ
1967 if (low == 0 && high == 0)
1968 get_zero (r, 0);
~
~
1969 else
1970 {
~
*仮数部以外の初期化
1971 memset (r, 0, sizeof (*r));
1972 r->cl = [[rvc_normal>enum real_value_class]];
1973 r->sign = high < 0 && !unsigned_p;
1974 SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
1975
~
1976 if (r->sign)
1977 {
1978 high = ~high;
1979 if (low == 0)
1980 high += 1;
1981 else
1982 low = -low;
1983 }
1984
~
*仮数部にHIGHとLOWを入れていく
1985 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1986 {
1987 r->sig[[[SIGSZ]]-1] = high;
1988 r->sig[[[SIGSZ]]-2] = low;
1989 }
1990 else
1991 {
1992 gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
1993 r->sig[[[SIGSZ]]-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
1994 r->sig[[[SIGSZ]]-2] = high;
1995 r->sig[[[SIGSZ]]-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
1996 r->sig[[[SIGSZ]]-4] = low;
1997 }
1998
*正規化
1999 normalize (r);
2000 }
2001
~
*モードがある場合
2002 if (mode != [[VOIDmode>enum real_value_class]])
2003 real_convert (r, mode, r);
2004 }