给定浮点数时如何避免FPU?

Sha*_*baz 3 c floating-point fpu linux-kernel rtai

嗯,这根本不是一个优化问题.

我正在写一个(现在)简单的Linux内核模块,我需要找到一些位置的平均值.这些位置存储为浮点(即float)变量.(我是整个事情的作者,所以我可以改变它,但我宁愿保持漂浮的准确性,如果我可以避免它,也不参与其中).

现在,这些位置值仅存储(或至少用于)内核中的存储空间.一个用户应用程序写入这些数据(通过共享内存(我正在使用RTAI,所以我在内核和用户空间之间共享内存))和其他人从中读取数据.我假设浮点变量的读写不会使用FPU,所以这是安全的.

安全的,我的意思是避免在内核中使用FPU,更不用说某些系统甚至可能没有FPU.我不会使用kernel_fpu_begin/end,因为这可能会破坏我的任务的实时性.

现在在我的内核模块中,我真的不需要太多的精度(因为无论如何平均位置),但我需要它说0.001.我的问题是,如何在不使用FPU的情况下将浮点数转换为整数(原始数字的1000倍)?

我想过从float的位模式中手动提取数字,但我不确定这是不是一个好主意,因为我不确定endian-ness如何影响它,或者即使所有架构中的浮点都是标准的.

Hos*_*ork 5

如果你想告诉 gcc 使用软件浮点库,显然有一个开关,尽管在标准环境中可能不是交钥匙:

在 x86 linux 上使用软件浮点

事实上,这篇文章表明 linux 内核及其模块已经编译为-msoft-float

http://www.linuxsmiths.com/blog/?p=253

也就是说,@PaulR 的建议似乎最明智。如果你提供一个 API 来做你喜欢的任何转换,那么我不明白为什么它比其他任何东西都难看。


orl*_*rlp 5

SoftFloat软件包具有的功能float32_to_int32,你想要做什么(它实现了IEEE 754软件).

最后,无论如何在内核中使用某种浮点支持(无论是硬件还是软件)都是有用的,因此在项目中包含这一点很可能是一个明智的决定.它也不是太大.