Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何避免boost中有理数的标准化?_C++_Boost - Fatal编程技术网

C++ 如何避免boost中有理数的标准化?

C++ 如何避免boost中有理数的标准化?,c++,boost,C++,Boost,我正在使用Boost.Rational 1.46。根据它的 最后一个基本操作是规范化有理数。每当构造(并在适当位置分配)rational时,就会执行此操作。所有其他操作都会小心地将有理数保持在规范化状态。正常化成本相当于一个gcd和两个部门 对于大量使用相对较小的有理值(因此是小整数)的应用程序,规范化的代价太高,无法一直进行。有没有办法避免这种情况,或者只是在某些时刻强制执行?boost有理数的不变量是它们总是被规范化的(参见问题中引用的参考文献)。因此,如果您想使用非规范化的理性,就不能使用

我正在使用Boost.Rational 1.46。根据它的

最后一个基本操作是规范化有理数。每当构造(并在适当位置分配)rational时,就会执行此操作。所有其他操作都会小心地将有理数保持在规范化状态。正常化成本相当于一个gcd和两个部门


对于大量使用相对较小的有理值(因此是小整数)的应用程序,规范化的代价太高,无法一直进行。有没有办法避免这种情况,或者只是在某些时刻强制执行?

boost有理数的不变量是它们总是被规范化的(参见问题中引用的参考文献)。因此,如果您想使用非规范化的理性,就不能使用boost实现。

好吧,是的,这就是为什么我要问如何做到这一点。修改后的版本就可以了,不过可选的规范化会更好。您可以使用自己的实现。为了避免从头开始,您可以查看(参考)。本文描述了一个rational库,它可以选择trurnoff规范化。我不知道有任何(其他)库提供这种功能。对此要三思。因为中间结果在几次操作后很容易溢出基础整数类型。首先,随着数字(分子和分母)越来越大,以后简化方程的成本会越来越高(因此优化失败)。其次,切换到多精度或无限制精度整数也会遇到同样的问题,因为在多次操作之后,您将需要使用越来越多的内存。不管怎样,我很想知道你到底有什么经验。这是3年多以前的事了,但我们确实有一个用途,我们不需要标准化,而且,更重要的是,我们只会乘法一次,这样我们就不会积累比特了,可以这么说。此外,我们使用GCC的int128作为整数类型,其中我们的真实输入是int32,因此我们保证不会有溢出等。然而,最终我们设法修改了一个算法,使其仅依赖整数算术。这是有意义的,如果分母是先验有界的,则始终可以使用纯整数解决问题(可能的多精度)算法。