Tag: 浮点

为什么浮点数的有效数字是7或6

我在Wikipedia log 2 24 = 7.22中看到了这一点。 我不知道为什么我们应该计算2 ^ 24以及为什么我们应该使用log10 ……我真的需要你的帮助。

使用带有C的编译器选项捕获浮点exception

Gfortran有一个方便的-ffpe-trap编译器选项,但gcc没有类似的选项。 我隐约意识到他们以不同的方式处理exception,但还不足以知道为什么只能通过启用编译器标志来死于FPE ,而另一个则需要包含额外的代码来启用exception。

安全浮点分部

我的代码中有一些地方,我想确保2个任意浮点数(32位单精度)的除法不会溢出。 目标/编译器不保证(明确地)对-INF / INF的良好处理和(不完全保证IEEE 754的exception值 – (可能未定义) – 并且目标可能会改变)。 此外,我无法对这几个特殊地点的输入进行保存,我必须使用C90标准库。 我已经读过每个计算机科学家应该知道的关于浮点算术的内容但是说实话,我有点迷失了。 所以……我想问一下社区,如果以下代码可以解决问题,并且有更好/更快/更高/更正/更正的方法: #define SIGN_F(val) ((val >= 0.0f)? 1.0f : -1.0f) float32_t safedivf(float32_t num, float32_t denum) { const float32_t abs_denum = fabs(denum); if((abs_denum < 1.0f) && ((abs_denum * FLT_MAX) <= (float32_t)fabs(num)) return SIGN_F(denum) * SIGN_F(num) * FLT_MAX; else return num / denum; } 编辑:根据Pascal Cuoq的建议,将((abs_denum * […]

如果是整数,则使用sprintf格式化浮点数,不带小数位

最初我使用带有浮点数的sprintf总是带有2位小数,使用以下代码: static void MyFunc(char* buffer, const float percentage) { sprintf(buffer, “%.2f”, percentage); } 传递的百分比值之一是0x419FFFFF 20(调试器视图),这打印到缓冲区20.00。 我想改为在不是整数时显示2位小数,例如 94.74 displayed as 94.74 94.7 displayed as 94.70 0 displayed as 0 5 displayed as 5 100 displayed as 100 我目前正在使用以下代码: static void MyFunc(char* buffer, const float percentage) { int fractional_part = ((percentage – (int)percentage) * 100); if (0 […]

打印__float128,不使用quadmath_snprintf

在我关于32位十进制数的浮点/双精度分析的问题中,一个答案说要看一下__float128 。 我使用它,编译器可以找到它,但我无法打印它,因为编译器找不到标题quadmath.h 。 所以我的问题是: __float128是标准的,对吗? 怎么打印? 是不是quadmath.h标准? 这些答案没有帮助: 使用extern C C ++精度 印花 裁判也没有帮助。 请注意,我不想使用任何非标准库。 [编辑] 如果这个问题有答案,即使答案是否定的,也会有用。

按位浮点数到Int

我试图找出这个算法,但我得到谷歌的所有东西都是用铸造做的。 我需要知道细节。 所以,如果我们有一个浮点x并想要返回它的二进制表示,我们需要做什么? 我知道我们需要返回浮点数,如果它的NaN或无穷大,但其他步骤是什么? 编辑 该函数接受一个unsigned int,就像它是一个float一样,然后返回该数字所代表的整数。 我不能使用转换,只是条件和按位运算符。

如何显示浮点值的编码

我们如何在C中打印浮点值的编码? 我知道我可以使用%A ,但这不是我想要的格式。 例如,如果我的值是1.3416407,我想打印“0x3FABBAE2”,我不是“0X1.5775C4P + 0”。

基于X3.9-1978标准的最佳IEEE 754-1985表示

根据DICOM标准,可以使用十进制字符串的值表示来存储一种浮点。 见表6.2-1。 DICOM价值表示 : 十进制字符串:表示固定点编号或浮点数的字符串。 固定点数应仅包含字符0-9,可选的前导“+”或“ – ”和可选的“。”。 标记小数点。 浮点数应按ANSI X3.9的规定传送,带有“E”或“e”表示指数的开始。 十进制字符串可以用前导或尾随空格填充。 不允许嵌入空格。 “0” – “9”,“+”,“ – ”,“E”,“e”,“。” 和默认字符保留曲目的SPACE字符。 最多16个字节 所以我很想简单地使用64位double ( IEEE 754-1985 )来表示我的C代码中的内存值,这是基于输入最多存储16个字节的事实。 那些对X3.9-1978更多了解的人X3.9-1978证实这是最好的表示(与arbitrary-precision , float和/或long double arbitrary-precision相比)吗? 最好的,我的意思是表示往返读/写将在视觉上无损 。 我应该能够从磁盘读取这样的ASCII浮点表示,将其放入内存,并将其写回磁盘(如上所述),与原始值(尽可能为机器epsilon)相比具有最大精度。 有关如何将double精度表示为只有16个字节的存储空间的实际实现细节超出了本问题的范围,请参阅此处了解详细信息。

漂浮小于FLT_MIN。 为什么FLT_TRUE_MIN?

为了看看在浮动下溢的情况下会发生什么,我发现我可以使浮点数比FLT_MIN小得多。 我在OS 10.9上使用xcode 5.1。 语言方言是gnu99。 #include #include #include int main(int argc, const char * argv[]) { float underflow = FLT_MIN * 0.0000004; printf(“Float min is %f or %e.\nUnderflow is %f or %e\nMin float exp is %d.\n”, FLT_MIN, FLT_MIN, underflow, underflow, FLT_MIN_10_EXP); return 0; } 打印: 浮点最小值为0.000000或1.175494e-38。 下溢为0.000000或4.203895e-45 Min float exp是-37。 是否有更有效的方法来certificate数据类型的限制? 为什么FLT_MIN实际上不是最小的浮点值? 我应该使用其他常量吗? 输入上一个问题后,我找到了FLT_TRUE_MIN。 这个号码是多少?

可以使用双精度来表示64位数而不会丢失精度

我想使用lua(内部仅使用双精度)来表示一个整数,该整数不能在0到2 ^ 64-1之间出现舍入误差,否则会发生可怕的事情。 有可能这样做吗?