【发布时间】:2011-04-05 14:15:53
【问题描述】:
我正在编写一个创建 ICC 颜色格式的程序。这些格式指定了一个名为 s15Fixed16Number 的数据类型,它有一个符号位、15 个整数位和 16 个小数位。 IEEE 754 32 位浮点数有一个符号位、8 个指数位和 23 个小数位。
我需要从文本框中获取输入,并将它们转换为 s15Fixed16Number。在 Google 图书上进行了一些搜索 this,但这是关于将十进制数转换为 s15Fixed16Number。我想我可以使用链接中解释的方法,但我还没有进行任何测试来确定它的准确性。我想我也可以尝试转换从文本框中输入的字符,但我还没有考虑那么多。
我正在使用 Cocoa,但我认为这并不重要;任何 C 函数都应该可以工作。以下是 s15Fixed16Number 格式的一些示例值:
-32768.0 = 0x80000000
0 = 0x00000000
1.0 = 0x00010000
32767 + (65535/65536) = 0x7FFFFFFF
我想距离那个数值计算课已经有一段时间了!
【问题讨论】:
-
如果示例转换正确,则 s15Fixed16Number 没有符号位:- 它只是一个标准的二进制补码符号编码。例如-32768.0 = 0x80000000 意味着:-1.0 = 0xffff0000
-
这得到了 ICC 配置文件格式规范的支持,该规范声称 s15Fixed16Number:“此类型表示具有 16 个小数位的固定有符号 4 字节/32 位数量。”。它没有说它有符号位,但数字是有符号的。
-
该标准只给出了一个(假的)负数示例,编码为 s15Fix16Number,值为 -32768.9999。这显然超出了有效范围。目前尚不清楚 -1 应该编码为什么;目前尚不清楚最小有效编码值是多少(-32768.00000 或 -32767.99999)。附录头部使用的类型为:
typedef long icS15Fixed16Number;. -
@Jonathon,我没有看到您在我刚刚从答案中的 URL 检索到的规范副本中引用的示例。从规范来看,恕我直言,最小值是 -32768.0。
-
@RBerteig:我引用的示例在 ICC 3.0 标准中,第 51 页第 7.2 节中定义了 s15Fixed16Number 此类型表示固定的有符号 4 字节/32 位数量,有 16 个小数位。编码是这样的:s15.16。 然后有一个表格,标题为“三刺激值”和“编码值”以及 4 对值:
{ -32768.9999 = 0xffffffff }, { 0 = 0x00000000 }, { 1.0 = 0x00010000 }, {32767.9999 = 0x7fffffff }。这是来自International Color Consortium 网站。