Commit d747ea72 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

resolve conflict

parents 05d3b9de 61577e8d
...@@ -16,7 +16,6 @@ extern "C" { ...@@ -16,7 +16,6 @@ extern "C" {
#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f)) #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val); mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val);
mrb_value mrb_flo_to_str(mrb_state *mrb, mrb_value flo);
mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base); mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base);
......
...@@ -59,6 +59,7 @@ typedef short mrb_sym; ...@@ -59,6 +59,7 @@ typedef short mrb_sym;
# include <float.h> # include <float.h>
# define isnan _isnan # define isnan _isnan
# define isinf(n) (!_finite(n) && !_isnan(n)) # define isinf(n) (!_finite(n) && !_isnan(n))
# define signbit(n) (_copysign(1.0, (n)) < 0.0)
# define strtoll _strtoi64 # define strtoll _strtoi64
# define strtof (float)strtod # define strtof (float)strtod
# define PRId32 "I32d" # define PRId32 "I32d"
......
...@@ -108,18 +108,12 @@ num_div(mrb_state *mrb, mrb_value x) ...@@ -108,18 +108,12 @@ num_div(mrb_state *mrb, mrb_value x)
* representation. * representation.
*/ */
mrb_value static mrb_value
mrb_flo_to_str(mrb_state *mrb, mrb_value flo) mrb_flo_to_str(mrb_state *mrb, mrb_float flo)
{ {
double n; double n = (double)flo;
int max_digits = FLO_MAX_DIGITS; int max_digits = FLO_MAX_DIGITS;
if (!mrb_float_p(flo)) {
mrb_raise(mrb, E_TYPE_ERROR, "non float value");
}
n = (double)mrb_float(flo);
if (isnan(n)) { if (isnan(n)) {
return mrb_str_new_lit(mrb, "NaN"); return mrb_str_new_lit(mrb, "NaN");
} }
...@@ -140,12 +134,22 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo) ...@@ -140,12 +134,22 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo)
char *c = &s[0]; char *c = &s[0];
int length = 0; int length = 0;
if (n < 0) { if (signbit(n)) {
n = -n; n = -n;
*(c++) = '-'; *(c++) = '-';
} }
exp = (n > 1) ? floor(log10(n)) : -ceil(-log10(n)); if (n != 0.0) {
if (n > 1.0) {
exp = (int)floor(log10(n));
}
else {
exp = (int)-ceil(-log10(n));
}
}
else {
exp = 0;
}
/* preserve significands */ /* preserve significands */
if (exp < 0) { if (exp < 0) {
...@@ -188,7 +192,7 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo) ...@@ -188,7 +192,7 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo)
while (max_digits >= 0) { while (max_digits >= 0) {
double weight = pow(10.0, m); double weight = pow(10.0, m);
double fdigit = n / weight; double fdigit = n / weight;
if (fdigit < 0) fdigit = n = 0; if (fdigit < 0) fdigit = n = 0;
if (m < -1 && fdigit < FLO_EPSILON) { if (m < -1 && fdigit < FLO_EPSILON) {
if (e || exp > 0 || m <= -abs(exp)) { if (e || exp > 0 || m <= -abs(exp)) {
...@@ -254,7 +258,7 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo) ...@@ -254,7 +258,7 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo)
static mrb_value static mrb_value
flo_to_s(mrb_state *mrb, mrb_value flt) flo_to_s(mrb_state *mrb, mrb_value flt)
{ {
return mrb_flo_to_str(mrb, flt); return mrb_flo_to_str(mrb, mrb_float(flt));
} }
/* 15.2.9.3.2 */ /* 15.2.9.3.2 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment