jon*_*onc 6 c c++ math cocoa types
我正在编写一个创建ICC颜色格式的程序.这些格式指定一个名为s15Fixed16Number的数据类型,它具有符号位,15个整数位和16个小数位.IEEE 754 32位浮点数具有符号位,8个指数位和23个小数位.
我需要从文本框中获取输入,并将它们转换为s15Fixed16Number.有些搜索在Google图书上显示了这一点,但这是在谈论将十进制数转换为s15Fixed16Number.我想我可以使用链接中解释的方法,但我还没有做任何测试来确定它的准确性.我想我也可以尝试转换文本框中的字符输入,但我还没有想过那么多.
我正在使用Cocoa,但我认为这不重要; 任何C函数都应该有效.以下是s15Fixed16Number格式的一些示例值:
-32768.0 = 0x80000000
0 = 0x00000000
1.0 = 0x00010000
32767 + (65535/65536) = 0x7FFFFFFF
Run Code Online (Sandbox Code Playgroud)
我想自从那个数值计算课以来已经有一段时间了!
假设您的 C 环境对 2 的整数求补,那么这比看起来要简单得多。
\n\ntypedef long s1516; // 32bit 2\'s complement signed integer\ns1516 floattos1516(double f) {\n return (s1516)(f * 65536. + 0.5);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n该表示形式是一个定点值,带有 16 位小数。这与分母始终为 65536 (或 2 16 )的有理数相同。要从浮点值形成这样的有理数,只需乘以分母即可。然后,只需进行适当的舍入和对整数类型的截断即可。
\n\n该标准选择了他们所做的形式,因为如果您的系统使用 2 的补码整数算术,这才有效。尽管最左边的位确实表示符号,但它并不是浮点表示中使用的意义上的符号位。
\n\n如果您的计算是 truefloat而不是double,您会发现计算中的精度不如接近满刻度的数字的定点值中可用的精度。如果您在 中进行计算double,那么您的计算结果将始终比结果更精确。
编辑:
\n\n显然最新的规范可从 ICC获得,作为规范 ICC.1:2004-10(配置文件版本 4.2.0.0)。第 5.1.3 节:
\n\n\n\n\n5.1.3 s15固定16号
\n\n固定符号 4 字节/32 位数量,具有 16 个小数位,如表 3 所示。
\n
\n表 3\xc2\xa0\xe2\x80\x94 s15Fixed16Number\n 数字编码\n-32768,0 80000000h\n 0 00000000h\n 1,0 00010000h\n 32767 + (65535/65536) 7FFFFFFFh\n\n\n
除了本地化对小数点表示形式的偏好之外,这些值与我的理解完全一致,即表示形式只是带符号的 2 的补码整数,应除以 65536 以获得它们的值。
\n\n到表示形式的自然转换就是简单地乘以 65536,然后简单地除以 65536。选择合适的舍入规则是一个偏好问题。
\n\n满量程范围从 -32768.0 (0x80000000) 到约 32767.9999847412 (0x7fffffff)(含)。
\n\n我同意,如果规范恰好显示了任何负值的十六进制表示,那么会更清楚。我浏览了整个文档,我发现唯一以十进制和十六进制表示的值是 CIE XYZ 色度坐标,根据定义范围从 0 到 1,因此不能作为示例负值。
\n