Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
df8b3e5a
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,发现更多精彩内容 >>
You need to sign in or sign up before continuing.
提交
df8b3e5a
编写于
3月 13, 2012
作者:
N
nsz
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
clean up __expo2.c, use a slightly better k constant
上级
3a6c8286
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
14 addition
and
84 deletion
+14
-84
src/math/__expo2.c
src/math/__expo2.c
+7
-42
src/math/__expo2f.c
src/math/__expo2f.c
+7
-42
未找到文件。
src/math/__expo2.c
浏览文件 @
df8b3e5a
/* origin: FreeBSD /usr/src/lib/msun/src/k_exp.c */
/*-
* Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include "libm.h"
/*
* We use exp(x) = exp(x - kln2) * 2**k,
* k is carefully chosen to minimize |exp(kln2) - 2**k|
*/
static
const
uint32_t
k
=
1799
;
static
const
double
kln2
=
1246
.
97177782734161156
;
/* k is such that k*ln2 has minimal relative error and x - kln2 > log(DBL_MIN) */
static
const
int
k
=
2043
;
static
const
double
kln2
=
0x1
.
62066151
add8bp
+
10
;
/* exp(x)/2
when x is huge
*/
/* exp(x)/2
for x >= log(DBL_MAX), slightly better than 0.5*exp(x/2)*exp(x/2)
*/
double
__expo2
(
double
x
)
{
double
scale
;
int
n
;
/*
* efficient scalbn(y, k-1):
* 2**(k-1) cannot be represented
* so we use that k-1 is even and scale in two steps
*/
n
=
(
k
-
1
)
/
2
;
INSERT_WORDS
(
scale
,
(
0x3ff
+
n
)
<<
20
,
0
);
/* note that k is odd and scale*scale overflows */
INSERT_WORDS
(
scale
,
(
uint32_t
)(
0x3ff
+
k
/
2
)
<<
20
,
0
);
/* exp(x - k ln2) * 2**(k-1) */
return
exp
(
x
-
kln2
)
*
scale
*
scale
;
}
src/math/__expo2f.c
浏览文件 @
df8b3e5a
/* origin: FreeBSD /usr/src/lib/msun/src/k_expf.c */
/*-
* Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include "libm.h"
/*
* We use exp(x) = exp(x - kln2) * 2**k,
* k is carefully chosen to minimize |exp(kln2) - 2**k|
*/
static
const
uint32_t
k
=
235
;
static
const
float
kln2
=
162
.
88958740
f
;
/* k is such that k*ln2 has minimal relative error and x - kln2 > log(FLT_MIN) */
static
const
int
k
=
235
;
static
const
float
kln2
=
0x1
.
45
c778p
+
7
f
;
/* expf(x)/2
when x is huge
*/
/* expf(x)/2
for x >= log(FLT_MAX), slightly better than 0.5f*expf(x/2)*expf(x/2)
*/
float
__expo2f
(
float
x
)
{
float
scale
;
int
n
;
/*
* efficient scalbnf(y, k-1):
* 2**(k-1) cannot be represented
* so we use that k-1 is even and scale in two steps
*/
n
=
(
k
-
1
)
/
2
;
SET_FLOAT_WORD
(
scale
,
(
0x7f
+
n
)
<<
23
);
/* note that k is odd and scale*scale overflows */
SET_FLOAT_WORD
(
scale
,
(
uint32_t
)(
0x7f
+
k
/
2
)
<<
23
);
/* exp(x - k ln2) * 2**(k-1) */
return
expf
(
x
-
kln2
)
*
scale
*
scale
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录