Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
10a60b42
Commit
10a60b42
authored
Sep 22, 2006
by
kaa@polly.local
Browse files
Options
Browse Files
Download
Plain Diff
Merge polly.local:/tmp/22129/bug22129/my41-bug22129
into polly.local:/home/kaa/src/maint/m41-maint--07OGk
parents
59671a1b
1530b51d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
60 additions
and
25 deletions
+60
-25
mysql-test/r/type_float.result
mysql-test/r/type_float.result
+7
-0
mysql-test/t/type_float.test
mysql-test/t/type_float.test
+10
-1
strings/strtod.c
strings/strtod.c
+43
-24
No files found.
mysql-test/r/type_float.result
View file @
10a60b42
...
...
@@ -272,3 +272,10 @@ desc t3;
Field Type Null Key Default Extra
a double 0
drop table t1,t2,t3;
select 1e-308, 1.00000001e-300, 100000000e-300;
1e-308 1.00000001e-300 100000000e-300
0 1.00000001e-300 1e-292
select 10e307;
10e307
1e+308
End of 4.1 tests
mysql-test/t/type_float.test
View file @
10a60b42
...
...
@@ -179,4 +179,13 @@ show warnings;
desc
t3
;
drop
table
t1
,
t2
,
t3
;
# End of 4.1 tests
#
# Bug #22129: A small double precision number becomes zero
#
# check if underflows are detected correctly
select
1
e
-
308
,
1.00000001e-300
,
100000000
e
-
300
;
# check if overflows are detected correctly
select
10
e307
;
--
echo
End
of
4.1
tests
strings/strtod.c
View file @
10a60b42
...
...
@@ -30,7 +30,8 @@
#include <m_ctype.h>
#define MAX_DBL_EXP 308
#define MAX_RESULT_FOR_MAX_EXP 1.79769313486232
#define MAX_RESULT_FOR_MAX_EXP 1.7976931348623157
#define MIN_RESULT_FOR_MIN_EXP 2.225073858507202
static
double
scaler10
[]
=
{
1
.
0
,
1e10
,
1e20
,
1e30
,
1e40
,
1e50
,
1e60
,
1e70
,
1e80
,
1e90
};
...
...
@@ -57,10 +58,11 @@ double my_strtod(const char *str, char **end_ptr, int *error)
{
double
result
=
0
.
0
;
uint
negative
=
0
,
ndigits
,
dec_digits
=
0
,
neg_exp
=
0
;
int
exp
=
0
,
digits_after_dec_point
=
0
;
int
exp
=
0
,
digits_after_dec_point
=
0
,
tmp_exp
;
const
char
*
old_str
,
*
end
=
*
end_ptr
,
*
start_of_number
;
char
next_char
;
my_bool
overflow
=
0
;
double
scaler
=
1
.
0
;
*
error
=
0
;
if
(
str
>=
end
)
...
...
@@ -91,6 +93,7 @@ double my_strtod(const char *str, char **end_ptr, int *error)
while
((
next_char
=
*
str
)
>=
'0'
&&
next_char
<=
'9'
)
{
result
=
result
*
10
.
0
+
(
next_char
-
'0'
);
scaler
=
scaler
*
10
.
0
;
if
(
++
str
==
end
)
{
next_char
=
0
;
/* Found end of string */
...
...
@@ -114,6 +117,7 @@ double my_strtod(const char *str, char **end_ptr, int *error)
{
result
=
result
*
10
.
0
+
(
next_char
-
'0'
);
digits_after_dec_point
++
;
scaler
=
scaler
*
10
.
0
;
if
(
++
str
==
end
)
{
next_char
=
0
;
...
...
@@ -144,39 +148,54 @@ double my_strtod(const char *str, char **end_ptr, int *error)
}
while
(
str
<
end
&&
my_isdigit
(
&
my_charset_latin1
,
*
str
));
}
}
if
((
exp
=
(
neg_exp
?
exp
+
digits_after_dec_point
:
exp
-
digits_after_dec_point
))
)
tmp_exp
=
neg_exp
?
exp
+
digits_after_dec_point
:
exp
-
digits_after_dec_point
;
if
(
tmp_exp
)
{
double
scaler
;
if
(
exp
<
0
)
{
exp
=
-
exp
;
neg_exp
=
1
;
/* neg_exp was 0 before */
}
if
(
exp
+
ndigits
>=
MAX_DBL_EXP
+
1
&&
result
)
int
order
;
/*
Check for underflow/overflow.
order is such an integer number that f = C * 10 ^ order,
where f is the resulting floating point number and 1 <= C < 10.
Here we compute the modulus
*/
order
=
exp
+
(
neg_exp
?
-
1
:
1
)
*
(
ndigits
-
1
);
if
(
order
<
0
)
order
=
-
order
;
if
(
order
>=
MAX_DBL_EXP
&&
result
)
{
/*
This is not 100 % as we actually will give an owerflow for
17E307 but not for 1.7E308 but lets cut some corners to make life
simpler
*/
if
(
exp
+
ndigits
>
MAX_DBL_EXP
+
1
||
result
>=
MAX_RESULT_FOR_MAX_EXP
)
double
c
;
/* Compute modulus of C (see comment above) */
c
=
result
/
scaler
*
10
.
0
;
if
(
neg_exp
)
{
if
(
neg_exp
)
if
(
order
>
MAX_DBL_EXP
||
c
<
MIN_RESULT_FOR_MIN_EXP
)
{
result
=
0
.
0
;
else
goto
done
;
}
}
else
{
if
(
order
>
MAX_DBL_EXP
||
c
>
MAX_RESULT_FOR_MAX_EXP
)
{
overflow
=
1
;
goto
done
;
goto
done
;
}
}
}
scaler
=
1
.
0
;
exp
=
tmp_exp
;
if
(
exp
<
0
)
{
exp
=
-
exp
;
neg_exp
=
1
;
/* neg_exp was 0 before */
}
while
(
exp
>=
100
)
{
scaler
*=
1.0e100
;
result
=
neg_exp
?
result
/
1.0e100
:
result
*
1.0e100
;
exp
-=
100
;
}
scaler
*
=
scaler10
[
exp
/
10
]
*
scaler1
[
exp
%
10
];
scaler
=
scaler10
[
exp
/
10
]
*
scaler1
[
exp
%
10
];
if
(
neg_exp
)
result
/=
scaler
;
else
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment