我写了一个简单的代码:
\nsub euler-ex ($x) of Seq {\n 1, { $x**++$ / [\xc3\x97] 1 .. ++$ } ... Inf }\nsay " 5: " ~ euler-ex(5)[^20] ~ " = " ~ [+](euler-ex(5)[^20]);\n
Run Code Online (Sandbox Code Playgroud)\n输出:
\n5: 1 5 12.5 20.833333 26.041667 26.041667 21.701389 15.500992 9.68812 5.382289 2.6911445 1.22324748 0.50968645 0.19603325 0.07001187499 0.023337291662 0.0072929036444 0.00214497166011 0.000595825461143 0.000156796173985 = 148.41310786833832\n
Run Code Online (Sandbox Code Playgroud)\n如何指定该输出的位数,即来自序列的显式生成器的小数位数?
\n我正在使用Zarith库来进行任意精度的有理算术.假设我有一个有理数q
的类型Q.t
,即两个大整数的比率(Q
是Zarith的任意精度有理数模块).有时,为了便于阅读,我想将此数字打印为浮点数,有时我需要将此数字浮点数转换为以后的非任意精度计算.有没有办法将q
浮点数转换为一定的精度?
我转换q
为浮点的方式现在无法保证,并且可以创建未定义的浮点数(Z
是任意精度整数模块):
let to_float q =
let n, d = num q, den q in
(* check if d is zero and raise an error if it is *)
let nf, df = Z.to_float n, Z.to_float d in
nf /. df
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个问题,我可以获得最准确接近任何浮点数的浮点数q
?
编辑
如果有人有兴趣,我很快就会在OCaml中写下Mark Dickinson的回答.它可能(绝对)可以改进和清理.如果我这样做,或者如果有人有任何改进建议,我会编辑.但是现在这已经解决了我的问题!
let to_float q =
let n, d = num q, den q in
let n_sign = Z.sign n in …
Run Code Online (Sandbox Code Playgroud) 我想Rational
在它们的十进制扩展中显示一些值.也就是说3 % 4
,我宁愿显示,而不是显示0.75
.我希望这个功能是类型的Int -> Rational -> String
.第一种Int
是指定最大小数位数,因为Rational
扩展可能是非终止的.
Hoogle和Data.Ratio的黑线鳕没有帮助我.我在哪里可以找到这个功能?
我正在寻找一种将浮点数的精确值转换为两个整数的有理商的方法,即a / b
其中b
不大于指定的最大分母b_max
。如果b <= b_max
不可能满足条件,则结果回退到仍然满足条件的最佳近似值。
坚持,稍等。这里有很多关于截断实数的最佳有理近似的问题/答案,该数表示为浮点数。但是,我对浮点数的确切值感兴趣,它本身就是一个具有不同表示形式的有理数。更具体地说,浮点数的数学集合是有理数的子集。在 IEEE 754 二进制浮点标准的情况下,它是二元有理数的子集。无论如何,任何浮点数都可以转换为两个有限精度整数的有理商,如。a / b
因此,例如假设 IEEE 754 单精度二进制浮点格式,有理等价的float f = 1.0f / 3.0f
不是1 / 3
,而是11184811 / 33554432
。这是 的精确值f
,它是来自 IEEE 754 单精度二进制浮点数数学集合的一个数字。
根据我的经验,遍历(通过二分搜索)Stern-Brocot 树在这里没有用,因为当它被解释为截断的实数而不是精确的浮点数时,这更适合于逼近浮点数的值理性的。
可能,连分数是要走的路。
这里的另一个问题是整数溢出。想想我们要把有理数表示为二的商int32_t
,其中最大的分母b_max = …
c++ floating-point rational-number numerical-methods continued-fractions
我想测试DOORs对象的枚举属性的值.如何才能做到这一点?我在哪里可以找到描述这样基本功能的DXL文档?
if (o."Progress" == 0) // This does NOT work
{
// do something
}
Run Code Online (Sandbox Code Playgroud) 如何rational_cast<int64_t>
进行舍入?
目前我正在做这样的黑客攻击:
boost::rational<int64_t> pts = ..., time_base = ...;
int64_t rounded = std::llround(boost::rational_cast<long double>(pts / time_base));
Run Code Online (Sandbox Code Playgroud)
但我希望能够"正确"地做到这一点而不涉及浮点.
我有一个带有整数约束的 LP,我想使用 Python 以精确算术求解它。其实我只需要一个可行点。
编辑:“精确算术”这里指的是无界枚举数和分母的有理数。
之前的尝试:
ImportError: libqsopt_ex.so.2: cannot open shared object file: No such file or directory
,尽管据我所知,我给出了该库的路径。速度只是一个中等问题。我的较大实例有大约 500 个带有框约束的变量和 40 个等式,但涉及的数量可能很大。
考虑这个简短的 GHCi 会议:
ghci> import Data.Ratio
ghci> import Data.Word
ghci> 128 % 3 + 127 % 3 :: Ratio Word8
253 % 9
Run Code Online (Sandbox Code Playgroud)
为什么结果是253 % 9
而不是255 % 3 (= 85 % 1)
?
这确实是我的问题,但我很乐意详细说明。
首先,如果我删除类型,结果就是我所期望的:
ghci> 128 % 3 + 127 % 3
85 % 1
Run Code Online (Sandbox Code Playgroud)
类型Word8
似乎很重要。我知道潜在的整数溢出,但即便如此,我也无法理解结果。例如
ghci> 128 + 127 :: Word8
255
Run Code Online (Sandbox Code Playgroud)
这里没有溢出。这首先发生在
ghci> 128 + 128 :: Word8
0
ghci> 128 + 129 :: Word8
1
Run Code Online (Sandbox Code Playgroud)
如果我除以二而不是三,我仍然可以理解结果:
ghci> 128 % 2 + …
Run Code Online (Sandbox Code Playgroud) 我想对有理矩阵进行操作.我用的是模块numpy
和fractions
.
这是我的代码:
import numpy as np
from fractions import Fraction
m=np.matrix([[Fraction(1, 6), Fraction(8, 7)], [Fraction(1, 2), Fraction(3, 2)]])
print(np.linalg.det(m))
# Gives -0.321428571429
print(m[0,0]*m[1,1] - m[0,1]*m[1,0])
# Gives -9/28
Run Code Online (Sandbox Code Playgroud)
由于计算行列式只需要用高斯方法进行合理运算,因此有理矩阵的行列式是合理的.
所以我的问题是:为什么numpy会返回一个浮点而不是一个Fraction?我怎样才能得到理性的决定因素?
请注意,此矩阵上的其他操作可提供合理的输出(例如m.trace()
).
分子和分母是否存储为整数?具体来说,基本运算:和、减、乘、除是如何实现的?