Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
f6ceccd9
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
大约 1 年 前同步成功
通知
37
Star
125
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Musl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f6ceccd9
编写于
3月 29, 2012
作者:
N
nsz
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
math: rewrite modf.c and clean up modff.c
cleaner implementation with unions and unsigned arithmetic
上级
9f58d060
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
45 addition
and
72 deletion
+45
-72
src/math/modf.c
src/math/modf.c
+29
-60
src/math/modff.c
src/math/modff.c
+16
-12
未找到文件。
src/math/modf.c
浏览文件 @
f6ceccd9
/* origin: FreeBSD /usr/src/lib/msun/src/s_modf.c */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* modf(double x, double *iptr)
* return fraction part of x, and return x's integral part in *iptr.
* Method:
* Bit twiddling.
*
* Exception:
* No exception.
*/
#include "libm.h"
#include <math.h>
#include <stdint.h>
double
modf
(
double
x
,
double
*
iptr
)
{
int32_t
i0
,
i1
,
j0
;
uint32_t
i
;
union
{
double
x
;
uint64_t
n
;}
u
=
{
x
};
uint64_t
mask
;
int
e
;
EXTRACT_WORDS
(
i0
,
i1
,
x
);
j0
=
((
i0
>>
20
)
&
0x7ff
)
-
0x3ff
;
/* exponent of x */
if
(
j0
<
20
)
{
/* integer part in high x */
if
(
j0
<
0
)
{
/* |x| < 1 */
INSERT_WORDS
(
*
iptr
,
i0
&
0x80000000
,
0
);
/* *iptr = +-0 */
return
x
;
}
i
=
0x000fffff
>>
j0
;
if
(((
i0
&
i
)
|
i1
)
==
0
)
{
/* x is integral */
uint32_t
high
;
*
iptr
=
x
;
GET_HIGH_WORD
(
high
,
x
);
INSERT_WORDS
(
x
,
high
&
0x80000000
,
0
);
/* return +-0 */
return
x
;
}
INSERT_WORDS
(
*
iptr
,
i0
&~
i
,
0
);
return
x
-
*
iptr
;
}
else
if
(
j0
>
51
)
{
/* no fraction part */
uint32_t
high
;
if
(
j0
==
0x400
)
{
/* inf/NaN */
*
iptr
=
x
;
return
0
.
0
/
x
;
}
e
=
(
int
)(
u
.
n
>>
52
&
0x7ff
)
-
0x3ff
;
/* no fractional part */
if
(
e
>=
52
)
{
*
iptr
=
x
;
GET_HIGH_WORD
(
high
,
x
);
INSERT_WORDS
(
x
,
high
&
0x80000000
,
0
);
/* return +-0 */
return
x
;
}
else
{
/* fraction part in low x */
i
=
(
uint32_t
)
0xffffffff
>>
(
j0
-
20
);
if
((
i1
&
i
)
==
0
)
{
/* x is integral */
uint32_t
high
;
*
iptr
=
x
;
GET_HIGH_WORD
(
high
,
x
);
INSERT_WORDS
(
x
,
high
&
0x80000000
,
0
);
/* return +-0 */
if
(
e
==
0x400
&&
u
.
n
<<
12
!=
0
)
/* nan */
return
x
;
}
INSERT_WORDS
(
*
iptr
,
i0
,
i1
&~
i
);
return
x
-
*
iptr
;
u
.
n
&=
(
uint64_t
)
1
<<
63
;
return
u
.
x
;
}
/* no integral part*/
if
(
e
<
0
)
{
u
.
n
&=
(
uint64_t
)
1
<<
63
;
*
iptr
=
u
.
x
;
return
x
;
}
mask
=
(
uint64_t
)
-
1
>>
12
>>
e
;
if
((
u
.
n
&
mask
)
==
0
)
{
*
iptr
=
x
;
u
.
n
&=
(
uint64_t
)
1
<<
63
;
return
u
.
x
;
}
u
.
n
&=
~
mask
;
*
iptr
=
u
.
x
;
return
x
-
*
iptr
;
}
src/math/modff.c
浏览文件 @
f6ceccd9
#include "libm.h"
#include <math.h>
#include <stdint.h>
float
modff
(
float
x
,
float
*
iptr
)
{
uint32_t
u
,
mask
;
union
{
float
x
;
uint32_t
n
;}
u
=
{
x
};
uint32_t
mask
;
int
e
;
GET_FLOAT_WORD
(
u
,
x
);
e
=
(
int
)(
u
>>
23
&
0xff
)
-
0x7f
;
e
=
(
int
)(
u
.
n
>>
23
&
0xff
)
-
0x7f
;
/* no fractional part */
if
(
e
>=
23
)
{
*
iptr
=
x
;
if
(
e
==
0x80
&&
u
<<
9
!=
0
)
/* nan */
if
(
e
==
0x80
&&
u
.
n
<<
9
!=
0
)
{
/* nan */
return
x
;
SET_FLOAT_WORD
(
x
,
u
&
0x80000000
);
return
x
;
}
u
.
n
&=
0x80000000
;
return
u
.
x
;
}
/* no integral part */
if
(
e
<
0
)
{
SET_FLOAT_WORD
(
*
iptr
,
u
&
0x80000000
);
u
.
n
&=
0x80000000
;
*
iptr
=
u
.
x
;
return
x
;
}
mask
=
0x007fffff
>>
e
;
if
((
u
&
mask
)
==
0
)
{
if
((
u
.
n
&
mask
)
==
0
)
{
*
iptr
=
x
;
SET_FLOAT_WORD
(
x
,
u
&
0x80000000
)
;
return
x
;
u
.
n
&=
0x80000000
;
return
u
.
x
;
}
SET_FLOAT_WORD
(
*
iptr
,
u
&
~
mask
);
u
.
n
&=
~
mask
;
*
iptr
=
u
.
x
;
return
x
-
*
iptr
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录