下面,result1和result2变量值报告不同的值,具体取决于您是使用-g还是使用-O在GCC 4.2.1和GCC 3.2.0上编译代码(我还没有尝试过更新的GCC版本) :
double double_identity(double in_double)
{
return in_double;
}
...
double result1 = ceil(log(32.0) / log(2.0));
std::cout << __FILE__ << ":" << __LINE__ << ":" << "result1==" << result1 << std::endl;
double result2 = ceil(double_identity(log(32.0) / log(2.0)));
std::cout << __FILE__ << ":" << __LINE__ << ":" << "result2==" << result2 << std::endl;
Run Code Online (Sandbox Code Playgroud)
result1和result2 == 5仅在使用-g进行编译时,但如果使用-OI进行编译,则得到result1 == 6和result2 == 5.
这似乎与编译器完成优化的方式不同,或者内部与IEEE浮点表示有关,但我很好奇这种差异究竟是如何发生的.我希望尽可能避免看汇编程序.
以上是用C++编译的,但我认为如果使用printfs将其转换为ANSI-C代码,则会保持相同.
上述差异发生在32位Linux上,但不适用于64位Linux.
谢谢bg
我必须使用gnuplot在两个轴上绘制对数刻度的直方图.我需要垃圾桶在log10中等间距.在y轴上使用对数刻度不是问题.主要问题是在x轴上创建bin.例如,在log10中使用10个bin,第一个bin将是[1],[2],[3] .... [10 - 19] [20 - 29] ..... [100 190]等等.我在网上搜索过但我找不到任何实际的解决方案.如果在gnuplot中实现它太复杂了你能建议其他软件/语言来做吗?
有人问我会更具体地解释我需要做什么.我有这样一个(巨大的)列表:
1 14000000
2 7000000
3 6500000
.
.
.
.
6600 1
8900 1
15000 1
19000 1
Run Code Online (Sandbox Code Playgroud)
例如,它显示,14亿个IP地址已发送1个数据包,7个数百万个2个数据包.... 1个IP地址已发送6600个数据包,...,1个IP地址已发送19000个数据包.正如您所看到的,两个轴上的值都非常高,因此我无法在没有对数刻度的情况下绘制它.
我尝试的第一件事是因为我需要快速完成它,因为它是使用框在两个轴上使用gnuplot设置logscale来绘制这个列表.结果是可以理解的,但不太合适.事实上,盒子在x轴上变得越来越薄,因为很明显,10-100中的点数比1-10中的多!所以在第二个十年之后它变得非常混乱.
我必须找到非常大的日志.
我在C++中这样做
我已经做了乘法,加法,减法,除法的函数,但是对数存在问题.我不需要代码,我需要一个简单的想法如何使用这些函数来完成它.
谢谢.
PS抱歉,我忘了告诉你:我必须找到该号码的二进制对数
PS-2我发现在维基百科:
int floorLog2(unsigned int n) {
if (n == 0)
return -1;
int pos = 0;
if (n >= (1 <<16)) { n >>= 16; pos += 16; }
if (n >= (1 << 8)) { n >>= 8; pos += 8; }
if (n >= (1 << 4)) { n >>= 4; pos += 4; }
if (n >= (1 << 2)) { n >>= 2; pos += …Run Code Online (Sandbox Code Playgroud) (log n)^k = O(n)? For k greater or equal to 1.
我的教授在课堂上向我们介绍了这个陈述,但是我不确定函数是否具有O(n)的时间复杂度.甚至类似n^2 = O(n^2)的函数f(x)如何具有运行时复杂性?
至于声明它如何等于O(n)而不是O((logn)^ k)?
如果我想获取浮点数列表的乘积,那么最坏情况/平均情况下的精度损失是通过添加它们的日志然后获取总和而不是仅仅乘以它们来实现的.有没有这种情况实际上更准确?
在我的算法中,我想评估当前整数n是否恰好最接近0.1的任何正数的反对数,所以0.1,1.0,1.1,7.9,21.5等.
反对数?AntiLog(x)= 10 x
我找到了一个在线计算器,可以在这里找到antilog:http://ncalculators.com/number-conversion/anti-log-logarithm-calculator.htm但我无处可以找到任何用Python或任何其他编程语言执行此操作的示例.
如果我不能使用Python来查找一系列数字的反对数,我将不得不求助于在我的程序中存储一个反对数值列表,为了性能,我可能会考虑到这一点,但不管怎么说它很好.如何在代码中执行此操作.
更新: 使用第一个答案的代码,我能够做到这一点,这段代码完全展示了我想要做的所有事情:
#!/usr/bin/python
import sys
import math
for x in xrange(1, 1000000):
target = round(math.log10(x),1)
int_antilog = int(10**target+0.5) #fast round() alternative
if (x == int_antilog):
print 'do something at call ' + str(x)
Run Code Online (Sandbox Code Playgroud) 我正在阅读《算法简介》这本书,对此部分感到困惑:
我们还假设每个数据字的大小受到限制。例如,当使用> n大小的输入时,我们通常假定对于某些> c> = 1常数,整数由c lg n个位表示。我们要求c> = 1,以便每个单词都可以容纳n的值,从而使我们能够>索引各个输入元素,并且我们将c限制为常数,以使单词> size不会任意增长。
这个常数c的目的是什么?
我的表:
val
1
2
3
4
5
6
10
15
Run Code Online (Sandbox Code Playgroud)
预期结果:
bin | qty
1 | 1
2 | 2
4 | 3
8 | 3
Run Code Online (Sandbox Code Playgroud)
这意味着有包含/不包含范围,
我发现下面的代码,它计算log2的float x:
union { float f; unsigned int i; } vx = { x };
float y = vx.i;
y *= 1.0 / (1 << 23);
y = y - 126.94269504f;
return y;
Run Code Online (Sandbox Code Playgroud)
funion 的参数初始化为输入x然后使用i?我无法理解它是如何使用未初始化的东西的.vx.i实际上有什么价值?谢谢.