Tag: 浮点

浮点模数运算

我正在尝试实施三角函数的范围缩减操作。 但相反,我认为对输入数据执行模数pi / 2操作可能会更好。 我想知道什么算法存在并且对于32位IEEE 754浮点的操作有效? 我必须在汇编中实现这个,所以fmod,除法,乘法等只有一条指令不可用。 我的处理器使用16位字,我实现了32位浮点加法,减法,乘法,除法,平方根,余弦和正弦。 我只需要范围缩减(模数)来输入余弦和正弦值。

左移Float类型

在尝试时遇到编译器错误 float_val=float_val<<1; 它给出了一个错误,说“错误C2296:'<<':非法,左操作数的类型为'float'” 不能左移左浮球? 为什么会这样?

比较浮点数的位表示

假设我想要一个带有两个浮点数( x和y )的函数,我想比较它们不使用它们的float表示,而是将它们的按位表示forms作为32位unsigned int 。 也就是说,像-495.5这样的-495.5具有位表示0b11000011111001011100000000000000或0xC3E5C000作为float ,并且我有一个具有相同位表示的unsigned int (对应于十进制值3286614016 ,我不关心)。 有没有简单的方法让我只使用各自的unsigned int对应物中包含的信息对这些浮点数执行<=这样的操作?

迭代时浮点数不精确

我有一个函数,根据范围[0, 1]的值计算3d间距。 我面临的问题是,二进制浮点数不能正好代表1。 在函数中计算的数学表达式能够计算t=1.0的值,但该函数永远不会接受该值,因为它在计算之前检查是否为该范围。 curves_error curves_bezier(curves_PointList* list, curves_Point* dest, curves_float t) { /* … */ if (t 1) return curves_invalid_args; /* … */ return curves_no_error; } 如何使用此function计算t=1.0的3d点? 前段时间我听说过关于ELLIPSIS一些事情,我认为这与这个问题有关,但我不确定。 谢谢 编辑 :好的,对不起。 我假设浮动不能完全代表1,因为我面临的问题。 问题可能是因为我正在做这样的迭代: for (t=0; t <= 1.0; t += 0.1) { curves_error error = curves_bezier(points, point, t); if (error != curves_no_error) printf("Error with t […]

将int转换为C中的float(无转换)

如何将int转换为float(返回为unsigned,但解释为float)? 我不能使用任何高级语言结构,如联合,只有按位操作,控制逻辑(if / while),+和 – 等。

C中的动态浮点格式说明符

有没有办法让用户输入浮点格式说明符? 例如,如果我打印这个。 float c = 15.0123 printf(“%.2f”, c); // outputs: 15.01 如何为变量分配小数位数? 喜欢: int n = 3; float c = 15.0123 printf(“%.(%i)f”, n, c); // outputs: 15.012

如何规范尾数

我正在尝试将int转换为自定义浮点数,其中用户指定为exp和尾数保留的位数,但我不明白转换是如何工作的。 我的函数接受一个int值,而int exp表示数字(值* 2 ^ exp),即值= 12,exp = 4,返回192.但我不明白我需要做的更改这些过程。 我已经看了好几天并玩IEEE转换器网络应用程序,但我只是不明白规范化过程是什么。 就像我看到它“移动二进制点并调整指数”但我不知道这意味着什么,有人能给我一个例子吗? 我也不明白指数偏差是什么。 我唯一的信息是你只是给你的指数添加一个数字,但我不明白为什么。 我一直在谷歌搜索一个我能理解的例子,但这对我没有任何意义

将整数存储为浮点数

假设我有一个API,只允许我存储浮点数或浮点数组。 但是,我想在这里存储整数值。 我(大致)明白,我很好,直接投到2 ^ 23左右,但是如果我想要更高的话呢? 有没有什么方法可以利用浮动的32位更多,并确保我会得到相同的数字? 为了澄清: 我正在使用Pixar的PRMan(即RenderMan)对点云做一些操作。 我可以用C或C ++编写链接来预编译点云API。 PRMan绝不必使用我存储的这些内容; 在操作附加到点上的其他数据后,我只需要将它们完整地交还给我。

比较相同的浮点数时奇怪的输出?

比较C中的相同浮点值 与float和float文字相比较的奇怪输出 浮动添加提升到双倍? 我在浮点上阅读了上面的链接,但是甚至得到了奇怪的输出。 #include int main() { float x = 0.5; if (x == 0.5) printf(“IF”); else if (x == 0.5f) printf(“ELSE IF”); else printf(“ELSE”); } 现在,根据促销规则,不应该打印“ ELSE IF ”吗? 但是,这里是打印“ IF ” 编辑:是因为0.5 = 0.1二进制,之后一切都为0,精度损失因此没有影响,因此比较IF返回true。 如果它是0.1,0.2,0.3,0.4,0.6,0.7 ……,则Else If块返回true。 请原谅我提出同样的问题,因为我已经从上面的链接中读到,浮动比较绝对不能完成。 但是,这种意外行为的原因是什么?

变量函数(va_arg)不适用于float,而printf有效吗? 有什么区别?

我碰巧在两年的问题中遇到了类似的情况: 变量函数(va_arg)不适用于float? 有人说,当我们称之为的时候,问题是促使浮动加倍 va_arg(arg, float) 我的问题是在这篇文章的最后,但首先让我们来看看@ Jack在上面链接的问题下面的答案: #include #include void foo(int n, …) { va_list vl; va_start(vl, n); int c; double val; for(c = 0; c < n; c++) { val = va_arg(vl, double); printf("%f\n", val); } va_end(vl); } int main(void) { foo(2, 3.3f, 4.4f); return 0; } 输出: 3.300000 4.400000 现在,如果我们将val = va_arg(vl, double)更改为val […]