给定计算n IEEE 754双精度浮点数x 0,x 1,...,x n - 1的算术平均值的任务,是否更精确
(ksum i x i)/ n
(即首先进行所有x i的Kahan和,然后除以n)或
ksum i(x i/n)
(即首先将x i除以n然后进行Kahan求和)?
我自己的测试(在[0,1)中均匀分布的随机数和在0以σ= 1为中心的整个浮点数范围内的正态分布数字)是不确定的,表明两者都非常精确,但我选择的测试数据可能特别差.
我有一个8位无符号8位数的向量,范围为0 .. 12 in xmm0.我想对e向量中的每个元素执行以下转换:
if (e != 12)
e = 11 - e;
Run Code Online (Sandbox Code Playgroud)
也就是说,数字0,1,...,11被改变为11,10,...,0而12保持不变.其他值不会发生,我不在乎它们会发生什么.
如何使用SSE4指令集有效地实现此操作?
我正在研究一个有时使用的C库
static inline void myfunc(...)
Run Code Online (Sandbox Code Playgroud)
在定义函数时.
现在我尝试将其移植到不支持"静态内联"的旧C编译器.这是bcc - Bruce的C编译器.
我可以在替换的头文件中使用命令吗?
static inline void
Run Code Online (Sandbox Code Playgroud)
同
void
Run Code Online (Sandbox Code Playgroud)
在包含此头文件的所有程序中?
我正在尝试将为 x86 架构构建的设备驱动程序交叉编译到 ARM 平台。它的编译没有任何错误,但我认为所有功能都不可用。所以我检查了 makefile 并找到了这个特定的部分。
ifeq ($(ARCH),x86_64)
EXTRA_CFLAGS += -mcmodel=kernel -mno-red-zone
Run Code Online (Sandbox Code Playgroud)
这似乎是唯一依赖于架构的部分。在google上一段时间后,我发现 -mcmodel=kernel 用于内核代码模型,而 -mno-red-zone 是为了避免在内存中使用红色区域,并且它们都适用于 x86_64。但我不清楚,将 cmodel 设置为内核会产生什么影响?
(任何对arm问题的深入了解也将不胜感激。)
我想开发 FreeBSD 发行版的新功能或更改和现有程序,特别是用户空间¹。为此,我需要对 FreeBSD 代码库进行更改,然后编译和测试它们。²
在树上这样做/usr/src并在系统上安装结果似乎是一个坏主意,因为它需要您在 CURRENT 上运行您的开发机器,以 root 权限进行开发,并且如果您犯了错误,则软管您的系统。我想一定有更好的方法,并且可能是 FreeBSD 开发人员使用的标准设置。³
开发 FreeBSD 代码库的推荐工作流程是什么?
¹ 所以特定于内核开发的注意事项并不是非常重要
² 我熟悉开发后提交更改的流程
所以我知道当您执行x mod 2^n无符号操作时,编译器会简单地将操作转换为x & (2^n - 1).
但是当我使用有符号数字查看编译器实现时,例如
int signed_rem8(int x) { return x %8; }
Run Code Online (Sandbox Code Playgroud)
我得到这样的东西(https://godbolt.org/z/xY3Ef6WEc):
movl -4(%rbp), %eax
cltd
shrl $29, %edx
addl %edx, %eax
andl $7, %eax
subl %edx, %eax
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?
我正在使用C++ 文件传输程序,它将文件转换为二进制文件,将字节保存在char*中,然后通过TCP连接将该char*发送到另一台计算机.然后另一台计算机在本地重新创建该文件.该程序确实有效,但我遇到了大文件的大问题!我无法分配足够的数组索引来包含字节!例如,如果我想发送一个600MB的文件,我需要一个带有600万个索引的char*.这有效.但是一旦我走得更高,程序根本无法分配内存而我会收到错误.
我的一个朋友建议我将文件分成块并按块执行传输块,但这会产生大量其他挑战,并且需要我基本上重写整个程序.
有没有办法解决这个问题?
这是PDP-11代码混合C和汇编.在下面,u.u_rsav是一个数组指针,
savu(u.u_rsav);
该函数的汇编代码是
_savu: bis $340,PS
mov (sp)+,r1
mov (sp),r0
mov sp,(r0)+
mov r5,(r0)+
bic $340,PS
jmp (r1)
Run Code Online (Sandbox Code Playgroud)
看起来在进入程序之前,它首先推送参数,然后推送返回点PC值.因此,r1存储PC,r0存储参数.我的谜题是sp(堆栈指针)在汇编代码跳回调用点之前不会恢复到原始值.它仍然指向参数存储在堆栈中的位置.
我创建了一个使用 RDP(递归下降解析器)的计算器来解析和评估数学表达式“例如:5 cos(30) -5 (3+5)”。问题是我还尝试包含像“config”这样的命令,它可以让用户配置角度单位(Gra、Rad、Deg)。而这里我发现了代码设计的问题。
调用堆栈的简化示例:
int main()
{
parseexpr()
{
parseterm()
{
parsefactor()
{
parsecommand() or parsefct() or parsenumber();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在当用户输入“config”命令时。我想让他配置计算器(配置位于 .txt 文件内),然后跳回“main()”(他会被要求再次输入表达式),因为通过调用返回会出现问题堆栈,因为我需要一个返回值,而“parsecommand()”无法返回。
我的问题是如何清理调用堆栈,以便我可以通过“goto”语句直接返回到 main ?