Tag: 浮点

快速浮点到int转换(截断)

我正在寻找一种以快速便携(IEEE 754)方式将float截断为int方法。 原因是因为在这个函数中,50%的时间都花在了演员身上: float fm_sinf(float x) { const float a = 0.00735246819687011731341356165096815f; const float b = -0.16528911397014738207016302002888890f; const float c = 0.99969198629596757779830113868360584f; float r, x2; int k; /* bring x in range */ k = (int) (F_1_PI * x + copysignf(0.5f, x)); /* <– 50% of time is spent in cast */ x -= k […]

使用float格式说明符打印int变量

int main() { int a=5; float b=7.5; printf(“%d %f\n”,a,b); printf(“%d %f\n”,a,a); return 0; } 当我在gcc编译器中编译这个输出时是 5 7.500000 5 7.500000 但是在视觉工作室中,输出是 5 7.500000 5 0.000000 我无法理解gcc编译器输出。

如何从二进制文件读取和写入浮点数?

程序应该如何从C语言或Vala语言中读取和写入二进制文件中的浮点数? 用于写入和读取的通用API通常设计为以字节格式写入。 我的意思是你必须将一个字节数据的数组写入文件并以相同的格式读取。 我正在寻找一种以浮动格式编写和读取的方法。 没有类型转换,无需将数字更改为字符串。 可能吗?

为什么printf中相同表达式的输出与cout不同?

我正在使用Visual C ++ 2012并从命令行编译以下文件: #include int main() { printf(“%.5f”, 18/4+18%4); return 0; } 链接MSVCRT.LIB而不是LIBCMT以避免运行时错误R6002。 对于此程序,输出的值为0.00000。 但是,如果我在C ++中执行完全相同的操作 #include using namespace std; int main() { cout << 18/4+18%4 << endl; return 0; } 现在,它打印出6,就像它应该的那样。 有什么不同? 它与语言本身(C vs C ++)或输出方法(cout vs printf)有关,还是只是与MSVC的怪癖?

在C ++中进行数学运算时,浮点错误如何传播?

假设我们已经声明了以下变量 float a = 1.2291; float b = 3.99; float变量有精度6,(如果我理解正确的话)意味着计算机实际存储的数量与你想要的实际数量之间的差异将小于10^-6 这意味着a和b都有一些小于10^-6错误 所以在计算机内部实际上可能是1.229100000012123而b可能是3.9900000191919 现在让我们说你有以下代码 float c = 0; for(int i = 0; i < 1000; i++) c += a + b; 我的问题是, c的最终结果是否会产生小于10^-6的精度误差? 如果答案是否定的,那么我们怎么能真正知道这个精确度错误以及如果你按照自己的意愿和任何顺序应用任何类型的操作会发生什么?

浮点算术和机器epsilon

我正在尝试计算float类型的epsilon值的近似值(我知道它已经在标准库中)。 这台机器上的epsilon值是(用一些近似值打印): FLT_EPSILON = 1.192093e-07 DBL_EPSILON = 2.220446e-16 LDBL_EPSILON = 1.084202e-19 FLT_EVAL_METHOD为2所以一切都以long double精度完成,而float , double和long double分别为32,64和96位。 我试图从1开始得到一个近似的值并将其除以2直到它变得太小,用float类型执行所有操作: # include int main(void) { float floatEps = 1; while (1 + floatEps / 2 != 1) floatEps /= 2; printf(“float eps = %e\n”, floatEps); } 输出不是我想要的: float epsilon = 1.084202e-19 中间操作以最高精度完成(由于FLT_EVAL_METHOD的值),因此这个结果似乎是合法的。 但是,这个: // 2.0 is a double […]

最小化C中浮点错误的经验法则?

关于最小化浮点运算中的错误,如果我在C中执行如下操作: float a = 123.456; float b = 456.789; float r = 0.12345; a = a – (r * b); 如果我将乘法和减法步骤分开,计算结果是否会改变,即: float c = r * b; a = a – c; 我想知道CPU是否会以不同方式处理这些计算,从而在一种情况下误差可能会更小? 如果不是,我认为无论如何,是否有任何良好的经验法则来缓解浮点错误? 我可以按照有用的方式按摩数据吗? 请不要只说“使用更高的精度” – 这不是我所追求的。 编辑 有关数据的信息,在一般意义上,当操作导致非常大的数字(如123456789)时,错误似乎更糟。小数字(例如1.23456789)似乎在操作后产生更准确的结果。 我想象这个,还是扩大数字有助于准确?

打印浮点数的整数部分

我试图弄清楚如何在不使用库函数的情况下打印浮点数。 打印浮点数的小数部分结果非常简单。 打印整体部件更难: static const int base = 2; static const char hex[] = “0123456789abcdef”; void print_integral_part(float value) { assert(value >= 0); char a[129]; // worst case is 128 digits for base 2 plus NUL char * p = a + 128; *p = 0; do { int digit = fmod(value, base); value /= base; […]

sin中的sin v / s sinf函数

我试图在我的C程序中使用sinf函数,但它在MSVC 6.0下给我一个未定义的引用错误,但是sin工作正常。 这让我很好奇地发现sin与sin之间的区别。 sin和sinf之间的逻辑区别是什么? 我怎样才能实现自己的sinffunction?

C中的Double等于0问题

我正在实现一种算法来计算C中的自然日志。 double taylor_ln(int z) { double sum = 0.0; double tmp = 1.0; int i = 1; while(tmp != 0.0) { tmp = (1.0 / i) * (pow(((z – 1.0) / (z + 1.0)), i)); printf(“(1.0 / %d) * (pow(((%d – 1.0) / (%d + 1.0)), %d)) = %f\n”, i, z, z, i, tmp); sum […]