我需要计算一大组数字的几何平均值,其值不是先验有限的.天真的方式是
double geometric_mean(std::vector<double> const&data) // failure
{
auto product = 1.0;
for(auto x:data) product *= x;
return std::pow(product,1.0/data.size());
}
Run Code Online (Sandbox Code Playgroud)
但是,由于累积的下溢或溢出,这可能会失败product(注意:long double并不能真正避免这个问题).那么,下一个选择是总结对数:
double geometric_mean(std::vector<double> const&data)
{
auto sumlog = 0.0;
for(auto x:data) sum_log += std::log(x);
return std::exp(sum_log/data.size());
}
Run Code Online (Sandbox Code Playgroud)
这可行,但需要调用std::log()每个元素,这可能很慢.我可以避免吗?例如,通过跟踪(相当于)指数和product单独累计的尾数?
我已经在很多地方读过,整数溢出在C中定义得很好,与签名对应物不同.
下溢是一样的吗?
例如:
unsigned int x = -1; // Does x == UINT_MAX?
Run Code Online (Sandbox Code Playgroud)
谢谢.
我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况那么-1 == UINT_MAX mod(UINT_MAX + 1).
我知道缓冲区溢出是什么.我不知道缓冲区下溢是什么.
我猜它是一个特定的缓冲区接收而不是字节溢出,字节下溢.
char buffer[8];
fgets(buffer, sizeof(buffer), stdin);
Run Code Online (Sandbox Code Playgroud)
以上将不会出错.
char buffer_overflow[8];
fgets(buffer_overflow, 16, stdin);
Run Code Online (Sandbox Code Playgroud)
如果用户输入是例如"deutschland",则上述将导致缓冲区溢出.
我可以在代码中获得一个示例,缓冲区下溢是什么?
我需要计算一个非常小的数字列表,如
(0.1)^ 1000,0.2 ^(1200),
然后将它们归一化,使它们总结为一个ie
a1 = 0.1 ^ 1000,a2 = 0.2 ^ 1200
我想计算a1'= a1 /(a1 + a2),a2'= a2(a1 + a2).
我遇到了下溢问题,因为我得到a1 = 0.我怎么能绕过这个?从理论上讲,我可以处理日志,然后log(a1)= 1000*log(0.l)将是一种表示没有下溢问题的方法 - 但为了规范化我需要得到log(a1 + a2) - 我无法计算,因为我不能直接代表a1.
我用R编程 - 据我所知,c#中没有数据类型如Decimal,它可以让你比双精度值更好.
任何建议将不胜感激,谢谢
我遇到计算1.77e-308/10触发下溢异常的情况,但计算1.777e-308/10没有.这很奇怪,因为:
当浮点运算的真实结果的幅度(即,接近于零)小于目标数据类型中可表示为正常浮点数的最小值(来自算术下溢,维基百科)时,会发生下溢
换句话说,如果我们计算出x/y其中两个x和y的double,那么应该发生溢如果0 < |x/y| < 2.2251e-308(最小正正规化double是2.2251e-308).从理论上说,因此,无论是1.77e-308/10和1.777e-308/10应触发溢异常.该理论与我在下面的C程序中测试的内容相矛盾.
#include <stdio.h>
#include <fenv.h>
#include <math.h>
int main(){
double x,y;
// x = 1.77e-308 => underflow
// x = 1.777e-308 gives ==> no underflow
x=1.77e-308;
feclearexcept(FE_ALL_EXCEPT);
y=x/10.0;
if (fetestexcept(FE_UNDERFLOW)) {
puts("Underflow\n");
}
else puts("No underflow\n");
}
Run Code Online (Sandbox Code Playgroud)
为了编译程序,我使用了gcc program.c -lm; 我也尝试过Clang,它给了我相同的结果.任何解释?
[编辑]我通过这个在线IDE分享了上面的代码.
我试图在java中获得溢出和下溢异常,但无法获得任何好的教程.具体来说,我想学习
任何有用教程的链接都可以
我正在尝试计算log(a + b)给定log(a)和log(b)。问题是,log(a)而且log(b)非常消极,以至于当我尝试计算a和b它们自己时,它们下溢,我得到log(0),这是未定义的。
对于log(a * b)and log(a / b),这不是问题,因为log(a * b) = log(a) + log(b)and log(a / b) = log(a) - log(b)。有没有类似的方法来计算log(a + b)而不需要a和b他们自己,避免下溢?
language-agnostic floating-point precision logarithm underflow
基础是我有一个习惯NSURLProtocol.在startLoading,[self client]类型:
<_NSCFURLProtocolBridge> {NSURLProtocol, CFURLProtocol}
Run Code Online (Sandbox Code Playgroud)
问题是在垃圾收集环境中运行.因为我正在写一个屏幕保护程序,所以我不得不把它垃圾收集起来.但是,_NSCFURLProtocolBridge协议似乎总是抛出:
malloc: reference count underflow for (memory_id_here), break on auto_refcount_underflow_error to debug
调试控制台的示例转储是:
ScreenSaverEngine[1678:6807] client is <_NSCFURLProtocolBridge 0x20025ab00> {NSURLProtocol 0x200258ec0, CFURLProtocol 0x20029c400}ScreenSaverEngine(1678,0x102eda000) malloc: reference count underflow for 0x20025ab00, break on auto_refcount_underflow_error to debug.
您可以看到发生了下溢<_NSCFURLProtocolBridge 0x20025ab00>.
当我突破时auto_refcount_underflow_error,它似乎堆栈追溯到URLProtocolDidFinishLoading::
id client = [self client];
...
[client URLProtocolDidFinishLoading:self];
Run Code Online (Sandbox Code Playgroud)
这个问题似乎已经存在了一段时间,但在网上似乎没有任何答案:
http://lists.apple.com/archives/cocoa-dev/2008/May/msg01272.html http://www.cocoabuilder.com/archive/message/cocoa/2007/12/17/195056
该错误仅在垃圾收集环境中显示这些列出的错误.有关如何在不引起内存问题的情况下解决此问题的任何想法?我假设这可能与NSURLProtocol下面的CF类型不正确地发布有关?
是否有一般方法来检查给定数据类型(uint32,int等)的溢出或下溢?
我正在做这样的事情:
uint32 a,b,c;
... //initialize a,b,c
if(b < c) {
a -= (c - b)
}
Run Code Online (Sandbox Code Playgroud)
当我在一些迭代后打印时,它会显示一个很大的数字,如:4294963846.