Tag: 浮点

如何在c中生成NaN浮子?

float f = (float)’a’; if(f 0){ } else{ printf(“NaN\n”); } 如果它是NaN则f不会大于/等于/小于0 。 但是如何在第一时间产生这样的f ? 我尝试了各种方法来生产NaN ,但没有一种方法可行。

可以在便携式C中写入从double到int的转换

我需要编写像double_to_int(double val, int *err)这样的函数double_to_int(double val, int *err)它会在可能的情况下将double val转换为整数; 否则报告错误(NAN / INFs / OUT_OF_RANGE)。 所以伪代码实现看起来像: if isnan(val): err = ERR_NAN return 0 if val < MAX_INT: err = ERR_MINUS_INF return MIN_INT if … return (int)val 在SO上至少有两个类似的问题:在这个答案中它以足够干净的方式解决了,虽然它是C ++解决方案 – 在C中我们没有signed int的可移植数字。 在这个答案中,它解释了为什么我们不能只检查(val > INT_MAX || val < INT_MIN) 。 所以我看到的唯一可能的清洁方式是使用浮点环境,但它被称为实现定义的function。 所以我的问题是: 有没有办法以跨平台的方式实现double_to_intfunction(仅基于C标准,甚至不考虑支持IEEE-754的目标平台)。

将int转换为float时在后台会发生什么

我对于如何逐步将int转换为浮动有一些不了解? 假设我有一个二进制格式的带符号整数。 而且,我想把它用手漂浮。 但是,我不能。 因此,CAn一个人告诉我如何逐步进行转换? 我在c中进行多次转换? 喜欢; int a = foo ( ); float f = ( float ) a ; 但是,我还没弄清楚背景会发生什么。 而且,为了更好地理解,我想手工完成转换。 编辑:如果您对转换了解很多,您还可以提供有关浮动到双转换的信息。 而且,对于float到int

比较C中的相同浮点值

可能重复: 与float和float文字相比较的奇怪输出 当我尝试比较2个相同的float值时,它不会在以下代码中打印“相等的值”: void main() { float a = 0.7; clrscr(); if (a < 0.7) printf("value : %f",a); else if (a == 0.7) printf("equal values"); else printf("hello"); getch(); } 提前致谢。

如何获取浮点字节?

我正在使用HIDAPI将一些数据发送到USB设备。 这个数据只能作为字节数组发送,我需要在这个数据数组中发送一些浮点数。 我知道浮点数有4个字节所以我认为这可能有效: float f = 0.6; char data[4]; data[0] = (int) f >> 24; data[1] = (int) f >> 16; data[2] = (int) f >> 8; data[3] = (int) f; 后来我所要做的就是: g = (float)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]) ); 但测试这显示了像data[0] = (int) f >> 24; 总是返回0 […]

最佳的机器优化多项式极小极大近似于上的反正切?

为了以合理的精度简单有效地实现快速数学函数,多项式极小极大近似通常是选择的方法。 Minimax近似通常使用Remez算法的变体生成。 各种广泛使用的工具,如Maple和Mathematica,都具有内置function。 通常使用高精度算术来计算生成的系数。 众所周知,简单地将这些系数舍入到机器精度会导致所得实现中的次优精度。 相反,人们搜索密切相关的系数集合,这些系数可以精确地表示为机器编号,以生成机器优化的近似值。 两篇相关论文是: Nicolas Brisebarre,Jean-Michel Muller和Arnaud Tisserand,“计算机高效多项式近似”,ACM数学软件交易,Vol。 32,第2期,2006年6月,第236-256页。 Nicolas Brisebarre和Sylvain Chevillard,“高效多项式L∞近似”,第18届IEEE计算机算术研讨会(ARITH-18),蒙彼利埃(法国),2007年6月,第169-176页。 来自后一篇论文的LLL算法的实现可以作为Sollya工具的fpminimax()命令获得。 我的理解是,所有用于生成机器优化近似的算法都是基于启发式算法,因此通常不知道通过最佳近似可以实现什么样的精度。 我不清楚用于评估近似的FMA(融合乘法 – 加法)的可用性是否对该问题的答案有影响。 在我看来它应该是天真的。 我目前正在研究[-1,1]上的反正切的简单多项式近似,其在IEEE-754单精度算法中使用Horner方案和FMA进行评估。 请参阅下面的C99代码中的函数atan_poly() 。 由于目前无法访问Linux机器,我没有使用Sollya来生成这些系数,而是使用了我自己的启发式算法,可以将其简单地描述为最陡的体面和模拟退火的混合(以避免陷入局部最小值) 。 机器优化多项式的最大误差非常接近1 ulp,但理想情况下我希望最大ulp误差低于1 ulp。 我知道我可以改变我的计算以提高精度,例如使用表示超过单精度精度的前导系数,但我想保持代码完全一样(即尽可能简单)仅调整系数以提供最准确的结果。 “经过validation的”最佳系数集将是理想的,欢迎指向相关文献的指针。 我进行了一次文献检索,但找不到任何有助于超越Sollya的fpminimax() ,并且没有任何文章能够检查FMA(如果有的话)在这个问题上的作用。 // max ulp err = 1.03143 float atan_poly (float a) { float r, s; s = a * a; r = 0x1.7ed1ccp-9f; […]

在嵌入式C中使用带有sprintf()的浮点数

大家好,我想知道float变量是否可以在sprintf()函数中使用。 就像,如果我们写: sprintf(str,”adc_read = %d \n”,adc_read); 其中adc_read是一个整数变量,它将存储该字符串 “adc_read = 1023 \n” 在str (假设adc_read = 1023 ) 如何使用float变量代替整数?

为什么即使我使用浮子,5/2也会产生’2’?

我输入了以下代码(没有编译问题或任何东西): float y = 5/2; printf(“%f\n”, y); 输出只是: 2.00000 我的数学没错,是吗? 或者我错了/运营商? 这意味着鸿沟不是吗? 5/2应该等于2.5? 任何帮助是极大的赞赏!

为什么我在像1/2这样的浮点表达式中得到零?

可以请有人解释这个行为: #include int main(int argc, char **argv){ printf(“%f”, ( 1 / 2 ) ); return 0; } /* output : 0.00000 */

相同的浮点值比较为不等

我正在研究C中的一些“确定输出”问题。我遇到了这个看起来很简单的问题,但在运行代码后让我感到困惑。 我预期的输出是“真”。 但是在跑步时,它是“假的”。 当我使用printf()检查f的值时,它显示为0.1。 有人可以解释一下为什么f被赋予0.1对于IF语句不会返回true? 从我选择问题的地方找不到答案,我自己也找不到答案。 #include int main() { float f = 0.1; if (f == 0.1) printf(“True”); else printf(“False”); }