我有这个代码:
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/