首页
学习
活动
专区
圈层
工具
发布

C语言中的浮点类型(float、double和long double)

C语言long double(扩展精度浮点型)long double 提供比 double 更高的精度和范围,但其具体大小和实现因平台而异。...long double 适合极高精度需求的计算,但由于实现差异,跨平台一致性较差。浮点类型的存储与精度浮点数的存储遵循 IEEE 754 标准,分为符号位、指数和尾数三部分。...类型大小与平台依赖性浮点类型的大小和精度因编译器和硬件而异,C标准只规定了最低要求。...\n", sizeof(double));使用场景与注意事项选择合适的类型:简单计算用 float,高精度用 double,极高精度用 long double。...性能权衡:float 计算更快但精度低,long double 精度高但可能更慢。总结C语言的浮点类型 float、double 和 long double 提供了从小到大的精度和范围选择。

1.8K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java 中 long 和 double 的原子性?

    ---- java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗?...每当虚拟机遇到一个给变量赋值的指令时,都要使用该操作 store:把工作内存中的一个变量的值传递给主内存,以便随后的write操作 write:把store操作从工作内存中得到的变量的值写到主内存中的变量 其中,与赋值...如果使用volatile修饰long和double,那么其读写都是原子操作 对于64位的引用地址的读写,都是原子操作 在实现JVM时,可以自由选择是否把读写long和double作为原子操作 推荐JVM...因为采用了这种策略,所以64位的long和double的读与写都不是原子操作。 在硬件,操作系统,JVM都是64位的情况下呢?...因此我们可以猜测,在64位的环境下,long和double的读写有可能是原子操作。

    2.8K20

    double转long引发的一次线上故障

    问题背景 问题:部分客户订单页面展示异常问题 原因:double类型转成long类型,精度损失导致线上的故障。...下面为出现问题的具体代码 图片 问题验证 我们看下面会分别输出什么结果: 图片 837378982649737216 837378982649737276 837378982649737276 为什么精度会丢失: double...类型占用64位 1bit(符号位) 11bit(指数位) 52bit(尾数位) 科学计数法:拿十进制举例子:1.23x10的9次方:1.23就是尾数,9就是指数 所以double类型表示的数的范围是比...long类型要大,但是,由于浮点数是基于科学计数法的,因此它们不能精确地表示某些值,例如非常大或非常小的数字。...建议: 禁止直接将double类型转成long类型,对于一些高精度计算推荐使用BigDecimal BigDecimal是Java中提供的一种高精度数字类型,它可以表示任意精度的十进制数值,计算过程中不会有精度损失

    1.8K91

    Java中金额处理选择详解:BigDecimal vs Long vs Double

    Java中金额处理选择详解:BigDecimal vs Long vs Double 金额处理是开发中非常重要的一部分,特别是在金融、电商等涉及交易的系统中。...以下是对三种方式(BigDecimal、Long、Double)的详细分析,以及为什么推荐 BigDecimal 的原因。 1. Double 为什么不适合处理金额?...例如,除法运算需要恢复小数点,并手动进行舍入处理: long amountInCents = 12345; double amount = amountInCents / 100.0; // 恢复成元...BigDecimal 的优势与推荐 BigDecimal 是专为高精度场景设计的类,特别适合金融系统或需要精确计算的业务场景。...总结与推荐 特性 Double Long BigDecimal 精度 不准确 准确(需手动管理单位) 准确 范围 容易溢出 易溢出(但优于浮点数) 几乎无限 操作复杂度 简单 较复杂(需手动换算) 丰富且灵活

    1.6K10

    java基本数据类型, byte: short: int: long: float: double: float和double有什么区别 boolean: char:

    long: long 数据类型是 64 位、有符号的以二进制补码表示的整数; 最小值是 -9,223,372,036,854,775,808(-2^63); 最大值是 9,223,372,036,854,775,807...(2^63 -1); 这种类型主要使用在需要比较大整数的系统上; 默认值是 0L; 例子: long a = 100000L,Long b = -200000L。...double: double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数; 浮点数的默认类型为double类型; double类型同样不能表示精确的值,如货币; 默认值是 0.0d;...例子:double d1 = 123.4。...double而double的指数范围为-1023~1024 3、表达式指数位不同 float的表达式为1bit(符号位)回+8bits(指数位)+23bits(尾数位) double的表达式为1bit(

    1.7K00

    从硬件角度窥探32位机上Hotspot如何实现volatile修饰的double,long原子性

    仅供参考,如有不妥之处,请多指正 在网上看到许多博客说 java 的 volatile 修饰的 double 和 long 在 32 位机上也是保证原子性的。...但是没有说明为什么,怎么具体实现,是使用互斥量吗,但是要访问的 volatile 修饰的 long,double 变量的地址是随机的,而且数量可能很多 难道要给他们每人配一把 互斥量?...最后要说的是,在 ARM 中,无论是否是 volatile 修饰的 ,long 和 double 都要使用 上述的 ldrexd 和 strexd,所以可以猜测,在 ARM-32 下的hotspot,就算对...long 和 double 不加 volatile 也可以保证写入的原子性(未证实)。...所以在X86下,如果不用volatile 修饰 long 或者 double ,在并发清空下,可能引发一个线程修改了高32位,其他线程读到新的高32位,旧的32位的问题。

    71110

    Java,bit比特,byte字节,char字符,short,int,long,float,double,string,字母,汉字编码等

    -128~127 有 short 16 -32,768~32,767 有 char 16 ‘\u0000’~’\uffff’ 共有65535个字符表示 无 int 32 -232~232 -1 有 long...有 double 64 双精度浮点型 有 参考网址的话,直接上Oracle的官方文档就好: https://docs.oracle.com/javase/tutorial/java/nutsandbolts...个汉字所占的字节数也会有所不同,有些编码是占 2个字节,有些则不是,可能是 3个或者 4个》》 首先认识下Java中的数据类型: 1、Int整型:byte(8位,-128~127)、short(16位)、int(32位)、long...(64位) 2、Float型:float(32位)、double(64位) 3、char字符:unicode字符(16位) 下面参考了这篇文章: char与byte的区别:http://blog.csdn.net

    2.2K20

    long double 类型的属性,操作这些值的时候,为什么是分两次完成的

    1 实现 在Java中,对于long和double类型的属性,数值操作分两次完成的原因与它们的内部表示方式有关。 对于long类型,它的内部表示是64位的有符号整数。...这种拆分操作的方式可以确保对long和double类型的数值操作的正确性,同时也会带来一些性能上的开销。...因此,在进行大量的数值操作时,特别是在循环中,尽量避免频繁地对long和double类型的属性进行操作,以提高性能。...需要注意的是,对于long和double类型的属性,由于其拆分操作的特性,可能会导致在多线程环境下出现线程安全问题。...如果多个线程同时对同一个long或double类型的属性进行操作,可能会出现竞态条件和不一致的结果。

    61140

    getopt()、getopt_long()与getopt_long_only()获取命令行参数

    如果字母后跟两个冒号,则表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格,否则报错,这一点和一个冒号时是有区别的。...注意:不带参数的选项可以写在一起,比如使用shell命令rm -rf *删除当前目前下的所有文件与目录。-r表示递归删除,-f表示不提示立刻删除,它们两个都不带参数,这时就可以写在一起。...*longopts, int *longindex); 有了对getopt()了解,对getopt_long()的理解相对来说也就比较简单了,因为getopt_long()的用法与getopt()极其相似...如果flag是null(通常情况),则函数会返回与该项option匹配的val值;如果flag不是NULL,则将val值赋予flag所指向的内存,并且返回值设置为0。...由于个人水平有限,不足与错误在所难免,请不吝指教,万分感谢。

    5K71
    领券