objective-c - 为了支持小数字,我的变量应该是什么样的?

标签 objective-c

我有这个代码:

return 1.0 / (1 + exp(-x));

它用于计算给定 x 的 sigmoid 函数的值。问题是它总是返回 1.00000

我开始检查代码以查看它失败的地方,然后我得到了这个:

long double expV = exp(-x);
long double btm = (1 + expV);
long double calc = 1.0 / btw;

现在变量的值是:

(long double) expV = 3.0356148105583944943E-165
(long double) btm = 1
(long double) calc = 1

所以我的问题是如何解决这个问题,我应该为变量使用另一种类型还是应该更改代码中的某些内容?

更新BTM应为值(value):1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044HAMPH,WWOLHAM HAPY411111111104111111041111。

x 的值为 1,x 的类型为 double 而非 long double。我将其更改为 long double 并报告。

最佳答案

这里的问题是 long double 的精度不足以处理这么小的加法(在 btm 的情况下)。 '1' 比微小的 expV 更重要,因此,在 long double 的精度内,btm 仅为 1。

在回答你的问题时,你的代码很好:逻辑上没有错,你只需要更精确的数据类型。不幸的是,Objective-C 没有提供 (some discussion here about arbitrary precision in Objective-C) .但是,如果您愿意走得更远一点,the GNU MP library (和其他人)将能够帮助你解决任意精度的数学问题。当然,任意精度数学是以性能为代价的——遗憾的是天下没有免费的午餐。

关于objective-c - 为了支持小数字,我的变量应该是什么样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19044380/

相关文章:

ios - 在 View 中来回切换

ios - 如何将图像裁剪成圆角

objective-c - 保存到 watchOS 2 文档文件夹

iphone - 循环声音在循环结束时有咔嗒声

iphone - 为什么我的表格 View 单元格在使用 reloadRowsAtIndexPaths 重新加载时消失?

objective-c - Main.1 输出文件在 XCode 中有何作用?

objective-c - 将桥接头添加到现有目标项目时出错

objective-c - 无法使用 XCode 4.5 覆盖属性 getter

ios - MKMapView 未在 mapType MKMapTypeStandard 和 MKMapTypeHybrid 上加载

ios - 如何在 obj-c 上正确使用泛型?