Плавание/двойная точность в режимах отладки/выпуска

Свойства размера, которые вы пытаетесь установить, являются свойствами TabPane .

Селектор, который вы используете:

.tab-pane *.tab-header-area *.tab-header-background

, выбирает дочерний элемент заголовка вкладки дочернего элемента области заголовка вкладки панели вкладок: это StackPane (см. раздел «Основание» документов, указанных выше). StackPane не определяет эти свойства, поэтому в вашем CSS они не действуют.

Задайте свойства размера непосредственно на панели вкладок:

.tab-pane *.tab-header-area *.tab-header-background {
  -fx-background-color:transparent;
}

.tab-pane {
  -fx-tab-min-width:120px;
  -fx-tab-max-width:120px;
  -fx-tab-min-height:50px;
  -fx-tab-max-height:50px;
}

.tab {
  -fx-font-family: Arial;
  -fx-font-size: 18;
  -fx-background-color:royalblue ;
}

.tab:selected {
    -fx-background-color:blue ;
}

12
задан Daniel Fischer 9 May 2012 в 20:09
поделиться

4 ответа

Они могут действительно отличаться. Согласно спецификации ECMA CLR:

Места хранения для чисел с плавающей запятой (помехи, элементы массива и поля классов) имеют фиксированный размер. Поддерживаемые размеры ресурса хранения являются float32 и float64. Везде еще (на стопке оценки, как аргументы, как типы возврата, и как локальные переменные) числа с плавающей запятой представлены с помощью внутреннего типа с плавающей точкой. В каждом таком экземпляре номинальный тип переменной или выражения является или R4 или R8, но его значение может быть представлено внутренне с дополнительным диапазоном и/или точностью. Размер внутреннего представления с плавающей точкой является зависящим от реализации, может варьироваться и должен иметь точность, по крайней мере, столь же большой как та из переменной или представленного выражения. Неявное расширяющееся преобразование во внутреннее представление от float32 или float64 выполняется, когда те типы загружаются из устройства хранения данных. Внутреннее представление обычно является собственным размером для аппаратных средств, или как требуется для эффективного внедрения операции.

То, что это в основном означает, - то, что следующее сравнение может или не может быть равным:

class Foo
{
  double _v = ...;

  void Bar()
  {
    double v = _v;

    if( v == _v )
    {
      // Code may or may not execute here.
      // _v is 64-bit.
      // v could be either 64-bit (debug) or 80-bit (release) or something else (future?).
    }
  }
}

Возьмите домой сообщение: никогда не проверяйте плавающие значения на равенство.

22
ответ дан 2 December 2019 в 04:03
поделиться

На самом деле они могут отличаться, если режим отладки использует x87 FPU, и режим выпуска использует SSE для операции в секунду плавающей.

2
ответ дан 2 December 2019 в 04:03
поделиться

В ответ на запрос Frank Krueger выше (в комментариях) для демонстрации различия:

Скомпилируйте этот код в gcc без оптимизации и-mfpmath=387 (у меня нет причины думать, что он не работал бы над другими компиляторами, но я не попробовал его.) Затем компилируют его без оптимизации и-msse-mfpmath=sse.

Вывод будет отличаться.

#include <stdio.h>

int main()
{
    float e = 0.000000001;
    float f[3] = {33810340466158.90625,276553805316035.1875,10413022032824338432.0};
    f[0] = pow(f[0],2-e); f[1] = pow(f[1],2+e); f[2] = pow(f[2],-2-e);
    printf("%s\n",f);
    return 0;
}
1
ответ дан 2 December 2019 в 04:03
поделиться

Это - интересный вопрос, таким образом, я сделал немного экспериментирования. Я использовал этот код:

static void Main (string [] args)
{
  float
    a = float.MaxValue / 3.0f,
    b = a * a;

  if (a * a < b)
  {
    Console.WriteLine ("Less");
  }
  else
  {
    Console.WriteLine ("GreaterEqual");
  }
}

использование DevStudio 2005 и.Net 2. Я скомпилировал и как отладка и как выпуск и исследовал вывод компилятора:

Release                                                    Debug

    static void Main (string [] args)                        static void Main (string [] args)
    {                                                        {
                                                        00000000  push        ebp  
                                                        00000001  mov         ebp,esp 
                                                        00000003  push        edi  
                                                        00000004  push        esi  
                                                        00000005  push        ebx  
                                                        00000006  sub         esp,3Ch 
                                                        00000009  xor         eax,eax 
                                                        0000000b  mov         dword ptr [ebp-10h],eax 
                                                        0000000e  xor         eax,eax 
                                                        00000010  mov         dword ptr [ebp-1Ch],eax 
                                                        00000013  mov         dword ptr [ebp-3Ch],ecx 
                                                        00000016  cmp         dword ptr ds:[00A2853Ch],0 
                                                        0000001d  je          00000024 
                                                        0000001f  call        793B716F 
                                                        00000024  fldz             
                                                        00000026  fstp        dword ptr [ebp-40h] 
                                                        00000029  fldz             
                                                        0000002b  fstp        dword ptr [ebp-44h] 
                                                        0000002e  xor         esi,esi 
                                                        00000030  nop              
      float                                                      float
        a = float.MaxValue / 3.0f,                                a = float.MaxValue / 3.0f,
00000000  sub         esp,0Ch                            00000031  mov         dword ptr [ebp-40h],7EAAAAAAh
00000003  mov         dword ptr [esp],ecx                
00000006  cmp         dword ptr ds:[00A2853Ch],0        
0000000d  je          00000014                            
0000000f  call        793B716F                            
00000014  fldz                                            
00000016  fstp        dword ptr [esp+4]                    
0000001a  fldz                                            
0000001c  fstp        dword ptr [esp+8]                    
00000020  mov         dword ptr [esp+4],7EAAAAAAh        
        b = a * a;                                                b = a * a;
00000028  fld         dword ptr [esp+4]                    00000038  fld         dword ptr [ebp-40h] 
0000002c  fmul        st,st(0)                            0000003b  fmul        st,st(0) 
0000002e  fstp        dword ptr [esp+8]                    0000003d  fstp        dword ptr [ebp-44h] 

      if (a * a < b)                                          if (a * a < b)
00000032  fld         dword ptr [esp+4]                    00000040  fld         dword ptr [ebp-40h] 
00000036  fmul        st,st(0)                            00000043  fmul        st,st(0) 
00000038  fld         dword ptr [esp+8]                    00000045  fld         dword ptr [ebp-44h] 
0000003c  fcomip      st,st(1)                            00000048  fcomip      st,st(1) 
0000003e  fstp        st(0)                                0000004a  fstp        st(0) 
00000040  jp          00000054                            0000004c  jp          00000052 
00000042  jbe         00000054                            0000004e  ja          00000056 
                                                        00000050  jmp         00000052 
                                                        00000052  xor         eax,eax 
                                                        00000054  jmp         0000005B 
                                                        00000056  mov         eax,1 
                                                        0000005b  test        eax,eax 
                                                        0000005d  sete        al   
                                                        00000060  movzx       eax,al 
                                                        00000063  mov         esi,eax 
                                                        00000065  test        esi,esi 
                                                        00000067  jne         0000007A 
      {                                                          {
        Console.WriteLine ("Less");                        00000069  nop              
00000044  mov         ecx,dword ptr ds:[0239307Ch]                Console.WriteLine ("Less");
0000004a  call        78678B7C                            0000006a  mov         ecx,dword ptr ds:[0239307Ch] 
0000004f  nop                                            00000070  call        78678B7C 
00000050  add         esp,0Ch                            00000075  nop              
00000053  ret                                                  }
      }                                                    00000076  nop              
      else                                                00000077  nop              
      {                                                    00000078  jmp         00000088 
        Console.WriteLine ("GreaterEqual");                      else
00000054  mov         ecx,dword ptr ds:[02393080h]              {
0000005a  call        78678B7C                            0000007a  nop              
      }                                                            Console.WriteLine ("GreaterEqual");
    }                                                    0000007b  mov         ecx,dword ptr ds:[02393080h] 
                                                        00000081  call        78678B7C 
                                                        00000086  nop              
                                                              }

Что вышеупомянутые шоу то, что код с плавающей точкой является тем же и для отладки и для выпуска, компилятор предпочитает непротиворечивость оптимизации. Хотя программа приводит к неправильному результату (* не меньше, чем b), это - то же независимо от режима отладки/выпуска.

Теперь, Intel IA32 FPU имеет восемь регистров с плавающей точкой, Вы думали бы, что компилятор будет использовать регистры для хранения значений при оптимизации вместо того, чтобы писать в память, таким образом улучшая производительность, что-то вроде:

fld         dword ptr [a] ; precomputed value stored in ram == float.MaxValue / 3.0f
fmul        st,st(0) ; b = a * a
; no store to ram, keep b in FPU
fld         dword ptr [a]
fmul        st,st(0)
fcomi       st,st(0) ; a*a compared to b

но это выполнилось бы по-другому к отладочной версии (в этом случае, отобразило бы корректный результат). Однако изменение поведения программы в зависимости от опций сборки является очень плохой вещью.

Код FPU является одной областью, где рука, создающая код, может значительно превзойти компилятор по характеристикам, но действительно необходимо получить голову вокруг способа, которым работает FPU.

11
ответ дан 2 December 2019 в 04:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: