- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用以下公式计算 Champernowne constant C10:
在上面的公式中,我用 b 代替 10 来计算 C10。我希望能够使用 Boost 的 cpp_dec_float
计算任意精度的常量。
这是我的代码:
#include <boost/multiprecision/cpp_dec_float.hpp>
const long long PRECISION = 100;
typedef boost::multiprecision::number<
boost::multiprecision::cpp_dec_float<PRECISION> > arbFloat;
arbFloat champernowne()
{
arbFloat c, sub, n, k;
std::string precomp_c, postcomp_c;
for(n = 1; n == 1 || precomp_c != postcomp_c; ++n) {
for(k = 1; k <= n; ++k) {
sub += floor(log10(k));
}
precomp_c = static_cast<std::string>(c);
c += n / pow(10, n + sub);
postcomp_c = static_cast<std::string>(c);
}
return c;
}
下面是代码的分解:
我首先定义一个精度为 100 位的变量 arbFloat
(这经常更改 — 所以我不想使用 cpp_dec_float_100
)。
公式有两个求和 block ,所以我使用两个 for 循环来实现它们。在最里面的 for 循环中,我计算以 k = 1
开始的总和,条件是 k <= n
的 floor(log10(k))
。
我已验证在 floor()
上使用 log10()
和 cpp_dec_float
会返回具有正确精度的变量。
c
之前将 c += n / pow(10, n + sub)
转换为字符串 - 然后在计算之后将其转换为字符串。如果字符串相同,我将结束计算,因为已超出精度(进一步的计算将是多余的)。我还使用了这个设置(通过字符串转换和比较来检查超出的精度)来计算其他变量 - 它工作得很好。
c += n / pow(10, n + sub)
的最外层总和 - 以这种方式使用 pow()
确实保持了精度。最后,我返回 c
。当我运行这个程序时,我得到以下变量:
0.1234567891001100120001300001400000150000001600000001700000000180000000001900000000002000000000000210
对比真正的 Champerowne 常数 C10:
0.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253546
只有前 11 位数字是正确的,其余的都不是。我无法找到我要去哪里错了。我尝试了以下方法:
尝试用 c += n / pow(10, n + sub)
替换 c += n / pow(static_cast<arbFloat>(10), n + sub)
以检查 pow()
是否没有保持精度 - 但它没有改变任何东西。
尝试将 floor()
替换为将 log10(k)
转换为字符串并“舍入”字符串(仅保留 .
之前的字符)的方法 - 但它没有改变任何内容。
尝试将 k <= n
更改为 k < n
k <= n + 1
- 以防万一我误解了总和 - 但这只会使它更加不准确。
如果我需要解释更多,请告诉我。任何帮助将不胜感激!
最佳答案
sub 的前一个值在每次迭代中被继承;在循环内声明它。
arbFloat champernowne() {
arbFloat c;
for (int n = 1;; ++n) {
arbFloat sub;
for (int k = 1; k <= n; ++k) {
sub += floor(log10(k));
}
arbFloat const last = c;
c += n / pow(10, n + sub);
if (c == last) {
break;
}
}
return c;
}
关于c++ - 使用 Boost 计算 Champernowne 常数 C10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45151401/
我不明白基因编程的人工智能是如何实现的。可以确定最终方程中何时应该有一个常数。如果我采用公式 F(m) = ma; F(m) = m9.8,A.I.知道真正的数字 9.8 到底是多少吗?据我了解,您实
我的批次大小是可变的,所以我的所有输入都是以下形式 tf.placeholder(tf.float32, shape=(None, ...) 接受可变的批量大小。但是,如何创建具有可变批处理大小的常数
我有一个一维 Numpy 数组 A长度N .对于每个元素 x在数组中,我想知道数组中所有元素在[x-eps]范围内的比例是多少; x+eps ],其中 eps是一个常数。 N数量级为 15,000。
如果我像这样在文件中设置一些常量: 'use strict'; angular.module('balrogApp.config', []) .constant('balrogConfig',
谁能给我一个常量 r 值的例子? 因为显然即使文字也是右值而不是常量右值。 最佳答案 const T f(); 根据该定义,表达式 f() 是 const T 类型的右值表达式,即常量右值。 关于c+
我正在开发一个 Angular 应用程序,我想创建一个配置文件。根据我的阅读,我应该使用 Angular 常数。 所以我尝试创建我的常量。从我读到的内容( here , here 以及 here +
const int N = 100; void function1(int array[]){ // ... } void function2(int arra
考虑以下(工作)片段: Eigen::ArrayXd x (8); x > y (x.data(), 2, 4); 这也是可行的: const Eigen::ArrayXd const_x = x;
我知道你可以使用: #define _USE_MATH_DEFINES 然后: M_PI 得到常量 pi。但是,如果我没记错的话(欢迎评论)这是编译器/平台相关的。那么,当我将 pi 常量从 Linu
为什么这段代码无法编译? package main const a = 1.000001 const base = 0 const b = a+base func main() { f(b)
为什么下面的代码每条语句都引用了大O常量(这里我为了约定使用1)? 我的意思是,如果数组大小变大,时间复杂度可能会变大,对吗?而且总数会越来越大,会不会影响复杂度? 伪代码: def find_sum
我正在尝试创建一个函数来填充多个系列中缺失的数字,具有不同的数字比例,同时为每个系列生成一个常量列。 from tika import parser import pandas as pd impor
我正在尝试近似 e 的值(~2.7) 由此定义,对于每个第 n 项 在Python中使用递归函数。 到目前为止我已经得到了这个, def NapierConstant(runs): retur
系统提示我输入代码以某种方式打印 Champerowne 常量系列。 (实际使用它!)所以我们想找到这个系列的第 n 个数字:1234567891011121314...这是我的代码: #inclu
我正在学习硕士定理的期中考试,我遇到了案例 2 的示例,其中 k > 0。除了常数及其递增或计算方式之外,我了解有关定理的所有内容。 Case 2状态:T(n) = Θ(nlogba logk+1n)
问题实例:无向无权图 G=(V,E)。两个源节点a和b,两个目的节点c和d以及一个常数D(完全正数)。(我们可以假设lambda(c,d),lambda(a,b)>D,当lambda(x,y ) 是
我有一张很大的 table 。 它目前在 MySQL 数据库中。 我使用django。 我需要迭代 每个表的元素来预先计算一些特定的数据(也许如果我更好的话,我可以这样做,但这不是重点)。 我想在不断
VBScript 常数 常数是具有一定含义的名称,用于代替数字或字符串,其值从不改变。VBScript 定义了许多内部常数。详细信息,请参阅 VBScript 语言参考。 创建常数 您可以使用
我正在学习 javascript,我发现一个文件中有许多用操作数“:”而不是“=”完成的赋值。尽管问题的标题是这样,但我也在非常量中看到过它。那有什么意义呢?这里的“:”操作数是什么意思?谢谢。 v
鉴于应用程序启动: angular.module("starter", [ "ionic" ]) .constant("DEBUG", true) .run(function() {
我是一名优秀的程序员,十分优秀!