c++ - matlab生成的C函数用途不明
问题描述
有人可以帮我理解这个功能在做什么吗?我猜它在做某种幂运算。我在 google 上搜索了这个名字,它似乎来自 matlab 生成的一些 C 代码。有谁知道这个功能应该做什么?SNF 代表什么?谢谢你。
double rt_powd_snf(double u0, double u1)
{
double y;
double d0;
double d1;
if (isnan(u0) || isnan(u1))
{
y = NAN;
}
else
{
d0 = fabs(u0);
d1 = fabs(u1);
if (isinf(u1))
{
if (d0 == 1.0)
{
y = 1.0;
}
else if (d0 > 1.0)
{
if (u1 > 0.0)
{
y = INFINITY;
}
else
{
y = 0.0;
}
}
else if (u1 > 0.0)
{
y = 0.0;
}
else
{
y = INFINITY;
}
}
else if (d1 == 0.0)
{
y = 1.0;
}
else if (d1 == 1.0)
{
if (u1 > 0.0)
{
y = u0;
}
else
{
y = 1.0 / u0;
}
}
else if (u1 == 2.0)
{
y = u0 * u0;
}
else if ((u1 == 0.5) && (u0 >= 0.0))
{
y = sqrt(u0);
}
else if ((u0 < 0.0) && (u1 > floor(u1)))
{
y = NAN;
}
else
{
y = pow(u0, u1);
}
}
return y;
}
解决方案
此功能将一个提升double
到另一个的幂double
。
您可以通过pow
底部的调用看到这一点:
y = pow(u0, u1);
它还处理各种特殊情况,干净地处理非数字和无限输入,并有效地处理特殊值。
这powd
意味着它是一个使用双打的幂函数。从文档来看,_snf
意味着它可以处理非有限数字。rt_
前缀来自配置变量MAT文件变量名修饰符。我猜这代表“运行时”,但这不是成立的。
在代码中,d0
和d1
是输入u0
和的绝对(负数变为正数)版本u1
。结果在y
.
遍历代码:
- 如果底数或指数是 NAN
- 返回南
- 如果指数是无限的
- 如果绝对基数是 1.0
- 返回 1.0
- 如果绝对基数大于 1.0
- 如果指数为正(无穷大)
- 返回无限
- 否则指数为负(无穷大)
- 返回 0.0
- 如果指数为正(无穷大)
- 否则绝对基数小于 1.0
- 如果指数为正(无穷大)
- 返回 0.0
- 否则指数为负(无穷大)
- 返回无限
- 如果指数为正(无穷大)
- 如果绝对基数是 1.0
- 如果绝对指数为 0.0
- 返回 1.0
- 如果绝对指数为 1.0
- 如果指数为正 (1.0)
- 返回基地
- 否则指数为负 (1.0)
- 返回 1.0 / 基础
- 如果指数为正 (1.0)
- 如果指数是 2.0
- 返回基本时间本身
- 如果指数为 0.5 且底数为非负数
- 返回基数的平方根
- 如果底数为负且指数不是整数
- 返回南
- 否则情况不特殊
- 返回结果
pow(u0, u1)
- 返回结果
推荐阅读
- docker - 通过在 k8s 中的主 pod 上执行 exec 来提交作业
- java - 需要帮助将整数依赖方法转换为使用 BigInteger
- ios - Swift JSONDecoder 可选解包
- r - 如何编写一个 for 循环来创建 50 个不同点之间的欧几里得距离矩阵?R
- dotnetnuke - 如何在 2SXC 中强制内容编辑通过 ADAM 上传图片?
- css - 如何正确地将样式应用于 SVG 类?
- random - 是否可以在 TI-Basic 中制作真正的随机数生成器?
- powershell - 在 jenkins 文件中编写 Powershell 或直接在 jenkins 中编写
- angular - 量角器测试在 Firefox 中失败,“HTTP 方法不允许”
- javascript - 有没有限制复选框类型选择的 jQuery 函数的替代方法?