是否有更快的方式除以2,带符号,在汇编中比下例中的那个?
...
mov ecx, 2
idiv ecx
push eax #push the result
...
Run Code Online (Sandbox Code Playgroud) 我正在学习函数式编程,并且正在使用Ocaml,但是我遇到了一些函数问题.
无论如何,我有一个元组,我想返回它的第一个值.(很简单,我知道,对不起)
let bach (x,y):(float*float) = (x,y);;
val bach : float * float -> float * float = <fun>
Run Code Online (Sandbox Code Playgroud)
一切都很好,在这里很好.
let john (x,y):(float*float) = y;;
val john : 'a * (float * float) -> float * float = <fun>
Run Code Online (Sandbox Code Playgroud)
现在这让我很困惑.为什么'a那里?我知道它代表一个类型未知的变量,但我很困惑如何更改返回值.
我是一个自称n00b的函数式编程,请不要吃我:)
例如,如果我想找出类型\ f g h -> g (h f),我可以使用ghci解释器中的指令,如下所示:
Prelude> :t \ f g h -> g (h f)
\ f g h -> g (h f) :: t2 -> (t1 -> t) -> (t2 -> t1) -> t
Run Code Online (Sandbox Code Playgroud)
OCaml是否有相同的功能?
将"高"精度Double转换为Decimal时,由于Rounding,我将使用Convert.ToDecimal或转换为(Decimal)而失去精度.
示例:
double d = -0.99999999999999956d;
decimal result = Convert.ToDecimal(d); // Result = -1
decimal result = (Decimal)(d); // Result = -1
Run Code Online (Sandbox Code Playgroud)
Convert.ToDecimal(double)返回的Decimal值最多包含15位有效数字.如果value参数包含超过15个有效数字,则使用舍入舍入为最接近的数字.
所以为了保持我的精度,我必须将我的double转换为String然后调用Convert.ToDecimal(String):
decimal result = System.Convert.ToDecimal(d.ToString("G20")); // Result = -0.99999999999999956d
Run Code Online (Sandbox Code Playgroud)
这个方法是有效的,但是我想避免使用String变量来将Double转换为Decimal而不用15位后的舍入?
我如何定义以度为单位而不是通常的弧度的参数的三角函数,并为这些参数计算正确的舍入结果?
在将参数M_PI/180.0传递给弧度中的相应函数之前将参数乘以不起作用,因为M_PI/180.0它不是π/ 180."浮点运算手册"第5.5节提供了一种方法来计算参数的正确舍入乘积π/ 180,但是一些参数仍然是这样的,即该乘积接近两个连续可表示浮点数之间的中点,然后在弧度中应用甚至正确舍入的函数可能会产生错误的最终结果.
其可以单独或组合工作的两种策略是使用较高的精度和使用sinpi,cospi,tanpi从三角函数CRlibm,分别计算sin(?x),cos(?x)和tan(?x).
对于后一种策略,存在180分割的问题,这对许多论点来说并不完全正确.
关于更高精度的策略(将参数乘以π/ 180的扩展精度表示,然后应用弧度的扩展精度函数),"精确"情况可能仍然存在问题.指出的唯一合理结果的定理sin,cos和tan一个合理的说法中得到0仅适用于弧度版本.它显然不适用于度数版本,如果对于某些浮点输入x,sindeg(x)恰好是两个连续可表示的浮点数之间的中点,那么没有多少中间精度足以保证最终结果是正确舍入的.
似乎有相当多的民间传说知识在限制圈内浮动,关于散乱的陷阱与编组 - 解组数据相结合.我正在寻找这些花絮的可引用参考.
例如,曾经有人向我指出了库aterm并且提到作者已经清楚地考虑过这个并且磁盘上的表示是自下而上的(节点的子节点在数据流中的节点本身之前).当您需要重新共享每个节点(内存中已有可能相同的节点)时,这确实是正确的做法.这种重新分享通行证需要自下而上完成,因此解组本身也可能也是如此,因此可以在一次通过中完成所有操作.
我正在描述在我们自己的背景下遇到的困难,以及我们找到的解决方案.我很感激任何有关上述民俗知识的引用.有些人之前显然遇到过这些问题(aterm库只是一个例子).但我没有发现任何书面形式.即使是关于aterm的一小部分信息都是听说的.我并不担心它不可靠(你无法做到这一点),但"个人通信"和"看看它在源代码中是如何完成的"在引用中被认为是不好的形式.
我有足够的参考资料单独使用哈希值.我只对那些干扰编程其他方面的参考文献感兴趣,例如编组或分发.
我正在编写一个使用freetype2作为文本渲染引擎的opengl程序.
使用它的LCD子像素渲染,我发现渲染结果中总是有一些噪声像素,为什么会发生这种情况?此外,虽然它的手册说LCD模式会产生宽度为3的倍数的缓冲区,我经常发现宽度为3n + 1或3n + 2,与之不一致face->glyph->bitmap->width.

我是OCaml的新手,我想要实现一个类似于四线的游戏.我需要的是一些保持游戏状态的数据结构.游戏板是一个4x4的正方形,共有16块瓷砖.我正在寻找OCaml中的表示,这将使得在整个列,行或对角线中检索(或执行某些操作)所有元素变得容易和快速.我将在这个游戏上进行极小极大搜索,这就是为什么速度很重要.
到目前为止,我已经考虑过一维列表.列表的问题在于难以弄清楚哪些元素属于每个行/列/对角线,然后使用List.map例如检索它们.
我想过要用Array.make 4 (Array.make 4 Empty);;.这对于行来说绝对是完美的.很容易得到它们并在其上进行模式匹配.但是在单个列和对角线上进行模式匹配是一件苦差事.
我想要做的是有一个功能,它采用游戏板并返回包含所有行/列/对角线的列表.我想做,例如,match (rows,columns,diagonals) with (Empty, Empty, Empty, Empty) -> something.
我刚刚读到了关于行多态性以及它如何用于可扩展记录和多态变体的内容.
但是,Ocaml使用子类型来处理多态变体.为什么?它比行多态更强大吗?
假设您很快想要确定当以IEEE 754二进制64格式表示时π或π/ 10中哪一个具有最大相对误差.此外,您只有一个C编译器.
您可以编写下面的C程序,或者更简洁的版本:
#include <stdio.h>
#include <math.h>
volatile long double pil = 3.14159265358979323846L;
volatile double pi = 3.14159265358979323846;
volatile long double tpil = 0.314159265358979323846L;
volatile double tpi = 0.314159265358979323846;
int main() {
volatile long double abs = pil - pi;
printf("%La\n%La\n%La\n", pil, (long double)pi, abs);
printf("pi: abs err %La -> rel %La\n", abs, abs / pil);
volatile long double abst = tpil - tpi;
printf("pi/10: abs err %La -> rel %La\n", abst, abst / tpil);
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,这个程序显示π和π/ 10的相对误差是相同的:
0xc.90fdaa22168c235p-2 …