有没有办法意识到一个数字是否由于转换而被截断
Is there any way to realize if a number is truncated due to conversion?
在C++的大代码中,有许多计算和强制转换(针对不同的数据类型)最终得到一个浮点数,这个数字在这些大的计算和铸造中的某个地方被截断或四舍五入。
例如,我得到的不是正确和精确的数字 0.2500992,而是四舍五入的数字 0.2501。
- 如果数字因转换而被截断,是否有任何编译器警告?
- 是否有任何已知的软件可能会检查代码并告诉我哪些数字可能会被截断?
- 在什么情况下会发生浮点数截断(转换为哪种数据类型时)?
- 编译器是否舍入浮点数?我可以告诉编译器不要舍入吗?
谢谢
我发现减去两个浮点数时发生了一个小错误,我使用另一种方法是 ceil() 和 1 个浮点操作而不是三个浮点操作(第一种方法)进行计算。
它给出不同的结果,但两个结果是常数 0.2500992 或 0.2501。
在我看来,解决方案是使用 ceil 的方法,因为它具有较少的浮点操作小错误。
这是我的代码,可以清楚地解释我面临的问题。
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define PARTS_PER_MILLION 1000000
#define FLOATING_POINT_ERROR 0.00001
int main()
{
float ppm_f free_hd_ports;
float totalAllocatedVideoParties = 1.749899983406066894531250000000;
float num_hd720_vid_ports= 1.749899983406066894531250000000;
unsigned short min_video_parties = 30,numVidHD720Parties = 28,numVidCifParties = 84,numVidHDParties;
char buffer[25];
unsigned long ppm1,ppm2;
//method 1
numVidHD720Parties = floor(min_video_parties - totalAllocatedVideoParties);
free_hd_ports = (float)min_video_parties - totalAllocatedVideoParties;
ppm_f = (free_hd_ports - numVidHD720Parties);
printf("ppm_f calculated by method with floating point subsctraction: %.20fn",ppm_f);
//method 2
numVidHDParties = (unsigned short)ceil(num_hd720_vid_ports);
ppm_f = ((float)numVidHDParties) - num_hd720_vid_ports;
printf("ppm_f calculated by ceil method: %.20fn",ppm_f);
}
屏幕:
ppm_f calculated by method with floating point subsctraction: 0.25009918212890625000
ppm_f calculated by ceil method: 0.25010001659393310547
此示例显示了以下链接中描述的浮点计算错误,如前所述:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
相关文章:
- 如何定义依赖于参数包转换的函数的返回类型
- 独立于实现的浮点/整数转换
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- DirectX矩阵:相对于面向方向的转换(例如在FPS中)
- 将 lua 脚本转换为等效于它的指令(操作码)
- 将 c 样式强制转换转换为正确的 c++ 转换
- C# 是否有办法将双精度数组强制转换为类似于C++转换为 char* 的字符串?
- 动态强制转换适用于模板成员函数内的共享指针和弱指针,无需代码重复
- 我需要转换一些代码,以便它适用于输入和输出文件文本
- C++ 自动"类型转换"转换
- 可疑的指针转换转换(区域太小)
- 如何强制转换优先于其他转换
- 以具有多个点(版本号)的格式将数字强制转换(转换)为字符串
- size_t C++转换/转换为字符串
- 将复杂的C++转换转换为 C#
- 如何在 vim 中将 C 样式转换转换为C++样式转换
- 如何编写类型特征来检查一个类型是否可以通过非窄化转换转换为另一个类型
- 处理模棱两可的类型转换/转换的正确方法是什么?
- c++隐式转换:转换顺序
- 多态数据转换/转换设计模式