---
title: 数学库接口过滤脚本
description: "在探究精度问题的过程中，经常发现由于数学库不同而造成的差异。鲲鹏数学库团队为此开发了精度与ICC数学库IMF兼容的数学库KML，使得KML的计算结果与IMF一致。该团队对鲲鹏数学库与IMF进行了精度模拟，结果表明目前大部分函数都可以实现精度一致。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/precisionopt/kunpengprecision_12_0020.html
sourcePath: /source/zh/perftuning/precisionopt/kunpengprecision_12_0020.html
indexId: 959d02433175966c140494612ce14fd909ccab81f381fcbd3feee8ee2d297c5d64
---
# 数学库接口过滤脚本

#### 介绍

在探究精度问题的过程中，经常发现由于数学库不同而造成的差异。鲲鹏数学库团队为此开发了精度与ICC数学库IMF兼容的数学库KML，使得KML的计算结果与IMF一致。该团队对鲲鹏数学库与IMF进行了精度模拟，结果表明目前大部分函数都可以实现精度一致。


#### 精度函数清单（鲲鹏数学库和x86 IMF数学库已完全一致）

| 函数名 | 函数简介 |
| --- | --- |
| abs | 返回一个数的绝对值 |
| fabs | 返回一个数的绝对值 |
| ccos | 返回一个复数的余弦值 |
| ccosf | 返回一个复数的余弦值 |
| cexp | 返回一个复数的指数值 |
| cexpf | 返回一个复数的指数值 |
| cdiv | 返回两个复数的商 |
| cdivf | 返回两个复数的商 |
| ceil | 返回一个数的上限整数 |
| ceilf | 返回一个数的上限整数 |
| exp | 返回一个数的指数值 |
| expf | 返回一个数的指数值 |
| clog | 返回一个复数的自然对数 |
| clogf | 返回一个复数的自然对数 |
| cosd | 返回一个角度的余弦值 |
| cosdf | 返回一个角度的余弦值 |
| cosl | 返回一个长双精度数的余弦值 |
| cosl\_18 | 返回一个长双精度数的余弦值 |
| cos | 返回一个弧度的余弦值 |
| cosf | 返回一个弧度的余弦值 |
| csin | 返回一个复数的正弦值 |
| csinf | 返回一个复数的正弦值 |
| erf | 返回一个数的误差函数值 |
| erff | 返回一个数的误差函数值 |
| expl | 返回一个长双精度数的指数值 |
| expl\_18 | 返回一个长双精度数的指数值 |
| floor | 返回一个数的下限整数 |
| floorf | 返回一个数的下限整数 |
| fmod | 返回两个数的余数 |
| fmodf | 返回两个数的余数 |
| frexp | 返回一个数的尾数和指数 |
| frexpf | 返回一个数的尾数和指数 |
| gammaf | 返回一个数的伽马函数值 |
| hypot | 返回两个数的平方和的平方根 |
| ldexp | 返回一个数的乘方值 |
| ldexpl | 返回一个长双精度数的乘方值 |
| log | 返回一个数的自然对数 |
| logl | 返回一个长双精度数的自然对数 |
| llrint | 返回一个数的四舍五入整数 |
| lround | 返回一个数的四舍五入整数 |
| lroundf | 返回一个数的四舍五入整数 |
| fmodf\_18 | 返回两个数的余数 |
| nearbyint | 返回一个数的最接近整数 |
| nearbyintf | 返回一个数的最接近整数 |
| pow | 返回一个数的乘方值 |
| powf | 返回一个数的乘方值 |
| powl | 返回一个长双精度数的乘方值 |
| powi4i4 | 返回一个整数的乘方值 |
| powi4i4\_18 | 返回一个整数的乘方值 |
| powi8i4 | 返回一个长整数的乘方值 |
| powi8i4\_18 | 返回一个长整数的乘方值 |
| powi8i8 | 返回一个长整数的乘方值 |
| powr4i4 | 返回一个实数的乘方值 |
| rint | 返回一个数的最接近整数 |
| rintf | 返回一个数的最接近整数 |
| round | 返回一个数的四舍五入整数 |
| roundf | 返回一个数的四舍五入整数 |
| sin | 返回一个弧度的正弦值 |
| sinf | 返回一个弧度的正弦值 |
| sind | 返回一个角度的正弦值 |
| sindf | 返回一个角度的正弦值 |
| sinl | 返回一个长双精度数的正弦值 |
| sinl\_18 | 返回一个长双精度数的正弦值 |
| sqrt | 返回一个数的平方根 |
| sqrtl | 返回一个长双精度数的平方根 |
| trunc | 返回一个数的整数部分 |
| truncf | 返回一个数的整数部分 |
| cexp | 计算复数的指数函数 |
| cexpf | 计算单精度复数的指数函数 |
| cdiv | 计算两个复数的商 |
| cdivf | 计算两个单精度复数的商 |
| cabs | 计算复数的模长 |
| cpow | 计算复数的幂函数 |


#### 排查方法

保存如下脚本为math-filter.sh，然后在应用的二进制目录下运行math-filter.sh xx.exe来排查应用中包含的所有数学库接口。若出现未和x86的数学库函数对标过的接口，就联系KML数学库团队进行补齐。

```
#!/bin/bash 
#保存为xx.sh，然后cd到二进制目录，运行xx.sh 二进制名称即可 
name=$(basename $1) 
log_name=${name}_mathlib.log 
echo $name 
echo -e "collect mathlib function...\n" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libmathlib.so" >> $log_name 
echo -e "collect bsmath function...\n" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libbsmath.so" >> $log_name 
echo -e "collect pgmath function...\n" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libpgmath.so" >> $log_name 
echo -e "collect KML function...\n" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libk" >> $log_name 
echo -e "collect sys math function...\n" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libm.so" >> $log_name 
echo -e "collect fftw function...\n" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libfftw3" >> $log_name 
echo -e "collect blas&lapack function...\n" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libopenblas" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libblas" >> $log_name 
LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "liblapack" >> $log_name
```
