我正在编写一个用算术编码进行编码的小代码.我需要设定一个确定的精度,但我必须做错事.这是代码:
def encode(string, probabilities):
getcontext().prec = 28
start = 0.0
width = 1.0
for ch in string:
d_start, d_width = probabilities[ch]
start += d_start*width
width *= d_width
return random.uniform(start, start + width)
Run Code Online (Sandbox Code Playgroud)
正如我在python文档中读到的getcontext().prec应该设置我愿意使用的精度.在一些迭代之后,d_start和d_with非常小(~e ^ -20)并且变量start和width从那一刻起保持相同的valor.
如果需要进一步的信息,请不要犹豫要求.
提前致谢
编辑1:正确缩进代码
编辑2:我在每个总和之后打了一个d_start的打印来表示我的意思是说"并且变量的开始和宽度从那一刻起保持相同的价值."
在这里你有结果:
0.0
0.16
0.224
0.224
0.22784
0.22784
0.2280448
0.22812672
0.22812672
0.2281316352
0.2281316352
0.228131897344
0.228132002202
0.228132002202
0.228132008493
0.228132008493
0.228132008829
0.228132008963
0.228132008963
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
0.228132008971
Run Code Online (Sandbox Code Playgroud) 我试图控制我正在开发的程序的工作流程.为此,我有一个map< unsigned int, list < unsigned int > >第一个键将是id,第二个键(列表)将用于知道我是否正确结束所有任务.我在此列表中使用的唯一操作是:
myMap[iD].size()
myMap[iD].push_back(foo) <- ( foo is an unsigned int )
for (std::list<unsigned int>::iterator it=myMap[iD].begin(); it != myMap[iD].end(); ++it){
myMap[iD].erase(it)
}
Run Code Online (Sandbox Code Playgroud)
我的地图长度可以增长到1452个元素,每个元素列表大小可以从1000到5000的数量级.
当我运行程序时,有时会收到分段错误,有时会出现错误的分配错误.我的猜测是,这来自push_back,因为:
这是我使用地图的代码中唯一的部分:
if (FOO != 0){
if (PID != 0){
if ( myMap.size() + 5 < myMap.max_size()){
if (myMap[PID].size() > 1000) myMap[PID].pop_front();
myMap[PID].push_back(EVENTVALUE);
}
}
} else {
if (PID != 0 and foo2 != 0 and myMap.find(PID) != myMap.end()) {
for (std::list<unsigned int>::iterator it=myMap[PID].begin(); …Run Code Online (Sandbox Code Playgroud)