我正在尝试对一个简单的Fraction类做一些分析,我想要一些数据来比较那个类型doubles.
对,知道我正在寻找一些好的方法来获得2个数字之间的分数密度.馏分是基本上2点的整数(例如pair< long, long>),以及之间的密度s和t在该范围内可表示数的量.并且它需要是在O(1)或非常快的情况下完成的精确或非常好的近似.
为了使它更简单,假设我想要s和t之间的所有数字(不是分数)a/b,其中0 <= s <= a/b <t <= M,0 <= a,b < = M(b> 0,a和b是整数)
如果我的分数是一个只计数为6(M = 6)的数据类型,并且我希望密度在0和1之间,那么答案将是12.这些数字是:
0, 1/6, 1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5, 5/6.
Run Code Online (Sandbox Code Playgroud)
一种非常天真的方法是循环所有可能的分数,并计算那些不能简化的分数.就像是:
long fractionsIn(double s, double t){
long density = 0;
long M = LONG_MAX;
for(int d = 1; d < floor(M/t); d++){
for(int n = ceil(d*s); n < M; n++){
if( gcd(n,d) == 1 …Run Code Online (Sandbox Code Playgroud) 我是 Haskell 和 stm 的新手,我想制作一个简单的 rwlock。首先,我创建了 4 个主要函数(wlock、wunlock、rlock、runlock),需要 2 个 TVar 整数:读取线程和写入线程的数量。
此时我无法按预期使用它。我尝试这样编译
v1 <- atomically(newTVar 0);
v2 <- atomically(newTVar 0);
wlock v1 v2 -- wlock :: TVar Integer -> TVar Integer -> IO ()
Run Code Online (Sandbox Code Playgroud)
这当然很丑陋,但它有效(不知道为什么,因为原子地返回IO (TVar a)而不是TVar a)
我想要的是:
我试图通过隐藏价值观来让它变得更好。我在某处读到单子可能是可行的方法,但我还没有研究它们。相反,我尝试创建一个新类型的 Rwlock 作为
data Rwlock = Rwlock { readCant :: TVar Integer
,writeCant :: TVar Integer
}
Run Code Online (Sandbox Code Playgroud)
和一个构造函数,所以我可以做这样的事情:
import Rwlock
do{
a = rwconst;
forkIO(reader a);
forkIO(writer a);
}
Run Code Online (Sandbox Code Playgroud)
rlock a读者和作者都会打电话的地方wlock a。
问题: …