www.digitalmars.com Home | Search | D | Comments
Last update Sat Feb 25 11:48:35 2006
D
Language
Phobos
Comparisons

· Lexical
· Modules
· Declarations
· Types
· Properties
· Attributes
· Pragmas
· Expressions
· Statements
· Arrays
· Structs & Unions
· Classes
· Interfaces
· Enums
· Functions
· Operator Overloading
· Templates
· Mixins
· Contracts
· Conditional Compilation
· Handling errors
· Garbage Collection
· Memory Management
· Floating Point
· Inline Assembler
· Documentation Comments
· Interfacing To C
· Portability Guide
· Embedding D in HTML
· Named Character Entities
· Application Binary Interface

Ponto Flutuante

Valores Intermediários de Ponto Flutuante

Em muitos computadores, operações de grande precisão não tomam mais tempo que operações de menos precisão, então faz sentido usar as maiores precisões disponíveis para temporários internos. A filosofia não é para emburrecer a linguagem para o menor denominador comum do hardware, mas para habilitar maior exploração do hardware designado.

Para explressões de ponto flutuante e valores intermediários da expressão, uma maior precisão que o tipo da expressão pode ser usada. Somente a precisão mínima é ajustada pelos tipos dos operandos, não a máxima. Nota de Implementação: Em máquinas Intel x86, por exemplo, é esperado (mas não requerido) que as calculações intermediárias sejam feitas para todos os 80 bits de precisão implementados pelo hardware.

É possível que, devido ao maior uso de temporários  subexpressões comuns, código otimizado poça produzir uma resposta mais precisa que o código não-otimizado.

Algorítmos deveriam ser escritos para trabalhar baseado na precisão mínima da calculação. Eles não deveriam degradar ou falhar se a precisão atual é maior. Tipos float ou double, ao invés do tipo extendido, deveriam ser usados somente para:

  • reduzir consumo de memória para ordens grandes
  • compatibilidade de argumentos de função e dados com C

Tipos complexos e imaginários

Em lingugens existentes, há uma surpreendente quantia de esforço gasta em tentar comprimir um tipo complexo sobre facilidades de definição de tipos existentes: gabaritos, estruturas, sobrecarga de operadores, etc., e tudo normalmente falha no final. Falha porque a semântica de operações complexas pode ser sutil, e falha porque o compilador não sabe o que o programador está tentando fazer, então não podeotimizar a implementação semântica.

Isso é tudo feito evitando adicionar um novo tipo. Adicionar um novo tipo significa que o compilador pode fazer toda a semântica de complexos trabalhar "direito". O programador então pode confiar em uma implementação correta (ou ao menos ficável ) de complexos.

Vindo com a bagagem de um tipo complexo está a necessidade de um tipo imaginário. Um tipo imaginário elimina alguns subtos assuntos de semântica, e melhora o desempenho por não ter que fazer operações extras na parte real 0 incluída.

Literais imaginários tem um sufixo i:

ireal j = 1.3i;
Não hpa sintaxe particular de literais complexos, apenas some um tipo real e um imaginário:
cdouble cd = 3.6 + 4i;
creal c = 4.5 + 2i;
Números complexos tem duas propriedades:
.re	pega a parte real
.im pega a parte imaginária como uma real
Por exemplo:
cd.re		é 4.5 double
cd.im é 2 double
c.re é 4.5 real
c.im é 2 real

Controle de Arredondamento

Aritmética de ponto flutuante IEEE 754 inclui a habilidade de ajustar 4 diferentes modos de arredondamento. D adiciona sintaxe para acessá-los: [blah, blah, blah] [NOTA: isso é feito talvez melhor com uma chamada à biblioteca padrão]

Bandeiras de Exceção

Aritmética de ponto flutuante IEEE 754 pode ajustar várias bandeiras (flags) baseado no que aconteceu com uma computação: [blah, blah, blah]. Essas bandeiras podem ser ajustadas/reajustadas com a sintaxe: [blah, blah, blah] [NOTA: isso é feito talvez melhor com uma chamada à biblioteca padrão]

Comparações de Pontos Flutuantes

Além dos operadores de comparação habituais < <= > >= == !=, D adiciona mais que são específicos para pontos flutuantes. Estes são !<>= <> <>= !<= !< !>= !> !<> e combinam as semânticas para as extensões NCEG para C.
Operadores de comparação de pontos flutuantes

Operador Relações Inválido? Descrição

> < = ?

< F V F F sim menor que
> V F F F sim maior que
<= F V V F sim menor que ou igual a
>= V F V F sim maior que ou igual a
== F F V F não igual a
!= V V F V não diferente, menor que, ou maior que
!<>= F F F V não diferente
<> V V F F sim menor que ou maior que
<>= V V V F sim menor que, igual a, ou maior que
!<= V F F V não diferente ou maior que
!< V F V V não diferente, maior que, ou igual a
!>= F V F V não diferente ou menor que
!> F V V V não diferente, menor que, ou igual a
!<> F F V V não diferente ou igual a